15f757f3fSDimitry Andric //===-- ScriptedThreadPythonInterface.cpp ---------------------------------===// 25f757f3fSDimitry Andric // 35f757f3fSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 45f757f3fSDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 55f757f3fSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 65f757f3fSDimitry Andric // 75f757f3fSDimitry Andric //===----------------------------------------------------------------------===// 85f757f3fSDimitry Andric 95f757f3fSDimitry Andric #include "lldb/Host/Config.h" 10*0fca6ea1SDimitry Andric #include "lldb/Target/ExecutionContext.h" 115f757f3fSDimitry Andric #include "lldb/Utility/Log.h" 125f757f3fSDimitry Andric #include "lldb/lldb-enumerations.h" 135f757f3fSDimitry Andric 145f757f3fSDimitry Andric #if LLDB_ENABLE_PYTHON 155f757f3fSDimitry Andric 165f757f3fSDimitry Andric // LLDB Python header must be included first 175f757f3fSDimitry Andric #include "../lldb-python.h" 185f757f3fSDimitry Andric 195f757f3fSDimitry Andric #include "../SWIGPythonBridge.h" 205f757f3fSDimitry Andric #include "../ScriptInterpreterPythonImpl.h" 215f757f3fSDimitry Andric #include "ScriptedThreadPythonInterface.h" 225f757f3fSDimitry Andric #include <optional> 235f757f3fSDimitry Andric 245f757f3fSDimitry Andric using namespace lldb; 255f757f3fSDimitry Andric using namespace lldb_private; 265f757f3fSDimitry Andric using namespace lldb_private::python; 275f757f3fSDimitry Andric using Locker = ScriptInterpreterPythonImpl::Locker; 285f757f3fSDimitry Andric 295f757f3fSDimitry Andric ScriptedThreadPythonInterface::ScriptedThreadPythonInterface( 305f757f3fSDimitry Andric ScriptInterpreterPythonImpl &interpreter) 315f757f3fSDimitry Andric : ScriptedThreadInterface(), ScriptedPythonInterface(interpreter) {} 325f757f3fSDimitry Andric 335f757f3fSDimitry Andric llvm::Expected<StructuredData::GenericSP> 345f757f3fSDimitry Andric ScriptedThreadPythonInterface::CreatePluginObject( 355f757f3fSDimitry Andric const llvm::StringRef class_name, ExecutionContext &exe_ctx, 365f757f3fSDimitry Andric StructuredData::DictionarySP args_sp, StructuredData::Generic *script_obj) { 375f757f3fSDimitry Andric ExecutionContextRefSP exe_ctx_ref_sp = 385f757f3fSDimitry Andric std::make_shared<ExecutionContextRef>(exe_ctx); 395f757f3fSDimitry Andric StructuredDataImpl sd_impl(args_sp); 405f757f3fSDimitry Andric return ScriptedPythonInterface::CreatePluginObject(class_name, script_obj, 415f757f3fSDimitry Andric exe_ctx_ref_sp, sd_impl); 425f757f3fSDimitry Andric } 435f757f3fSDimitry Andric 445f757f3fSDimitry Andric lldb::tid_t ScriptedThreadPythonInterface::GetThreadID() { 455f757f3fSDimitry Andric Status error; 465f757f3fSDimitry Andric StructuredData::ObjectSP obj = Dispatch("get_thread_id", error); 475f757f3fSDimitry Andric 48*0fca6ea1SDimitry Andric if (!ScriptedInterface::CheckStructuredDataObject(LLVM_PRETTY_FUNCTION, obj, 49*0fca6ea1SDimitry Andric error)) 505f757f3fSDimitry Andric return LLDB_INVALID_THREAD_ID; 515f757f3fSDimitry Andric 525f757f3fSDimitry Andric return obj->GetUnsignedIntegerValue(LLDB_INVALID_THREAD_ID); 535f757f3fSDimitry Andric } 545f757f3fSDimitry Andric 555f757f3fSDimitry Andric std::optional<std::string> ScriptedThreadPythonInterface::GetName() { 565f757f3fSDimitry Andric Status error; 575f757f3fSDimitry Andric StructuredData::ObjectSP obj = Dispatch("get_name", error); 585f757f3fSDimitry Andric 59*0fca6ea1SDimitry Andric if (!ScriptedInterface::CheckStructuredDataObject(LLVM_PRETTY_FUNCTION, obj, 60*0fca6ea1SDimitry Andric error)) 615f757f3fSDimitry Andric return {}; 625f757f3fSDimitry Andric 635f757f3fSDimitry Andric return obj->GetStringValue().str(); 645f757f3fSDimitry Andric } 655f757f3fSDimitry Andric 665f757f3fSDimitry Andric lldb::StateType ScriptedThreadPythonInterface::GetState() { 675f757f3fSDimitry Andric Status error; 685f757f3fSDimitry Andric StructuredData::ObjectSP obj = Dispatch("get_state", error); 695f757f3fSDimitry Andric 70*0fca6ea1SDimitry Andric if (!ScriptedInterface::CheckStructuredDataObject(LLVM_PRETTY_FUNCTION, obj, 71*0fca6ea1SDimitry Andric error)) 725f757f3fSDimitry Andric return eStateInvalid; 735f757f3fSDimitry Andric 745f757f3fSDimitry Andric return static_cast<StateType>(obj->GetUnsignedIntegerValue(eStateInvalid)); 755f757f3fSDimitry Andric } 765f757f3fSDimitry Andric 775f757f3fSDimitry Andric std::optional<std::string> ScriptedThreadPythonInterface::GetQueue() { 785f757f3fSDimitry Andric Status error; 795f757f3fSDimitry Andric StructuredData::ObjectSP obj = Dispatch("get_queue", error); 805f757f3fSDimitry Andric 81*0fca6ea1SDimitry Andric if (!ScriptedInterface::CheckStructuredDataObject(LLVM_PRETTY_FUNCTION, obj, 82*0fca6ea1SDimitry Andric error)) 835f757f3fSDimitry Andric return {}; 845f757f3fSDimitry Andric 855f757f3fSDimitry Andric return obj->GetStringValue().str(); 865f757f3fSDimitry Andric } 875f757f3fSDimitry Andric 885f757f3fSDimitry Andric StructuredData::DictionarySP ScriptedThreadPythonInterface::GetStopReason() { 895f757f3fSDimitry Andric Status error; 905f757f3fSDimitry Andric StructuredData::DictionarySP dict = 915f757f3fSDimitry Andric Dispatch<StructuredData::DictionarySP>("get_stop_reason", error); 925f757f3fSDimitry Andric 93*0fca6ea1SDimitry Andric if (!ScriptedInterface::CheckStructuredDataObject(LLVM_PRETTY_FUNCTION, dict, 94*0fca6ea1SDimitry Andric error)) 955f757f3fSDimitry Andric return {}; 965f757f3fSDimitry Andric 975f757f3fSDimitry Andric return dict; 985f757f3fSDimitry Andric } 995f757f3fSDimitry Andric 1005f757f3fSDimitry Andric StructuredData::ArraySP ScriptedThreadPythonInterface::GetStackFrames() { 1015f757f3fSDimitry Andric Status error; 1025f757f3fSDimitry Andric StructuredData::ArraySP arr = 1035f757f3fSDimitry Andric Dispatch<StructuredData::ArraySP>("get_stackframes", error); 1045f757f3fSDimitry Andric 105*0fca6ea1SDimitry Andric if (!ScriptedInterface::CheckStructuredDataObject(LLVM_PRETTY_FUNCTION, arr, 106*0fca6ea1SDimitry Andric error)) 1075f757f3fSDimitry Andric return {}; 1085f757f3fSDimitry Andric 1095f757f3fSDimitry Andric return arr; 1105f757f3fSDimitry Andric } 1115f757f3fSDimitry Andric 1125f757f3fSDimitry Andric StructuredData::DictionarySP ScriptedThreadPythonInterface::GetRegisterInfo() { 1135f757f3fSDimitry Andric Status error; 1145f757f3fSDimitry Andric StructuredData::DictionarySP dict = 1155f757f3fSDimitry Andric Dispatch<StructuredData::DictionarySP>("get_register_info", error); 1165f757f3fSDimitry Andric 117*0fca6ea1SDimitry Andric if (!ScriptedInterface::CheckStructuredDataObject(LLVM_PRETTY_FUNCTION, dict, 118*0fca6ea1SDimitry Andric error)) 1195f757f3fSDimitry Andric return {}; 1205f757f3fSDimitry Andric 1215f757f3fSDimitry Andric return dict; 1225f757f3fSDimitry Andric } 1235f757f3fSDimitry Andric 1245f757f3fSDimitry Andric std::optional<std::string> ScriptedThreadPythonInterface::GetRegisterContext() { 1255f757f3fSDimitry Andric Status error; 1265f757f3fSDimitry Andric StructuredData::ObjectSP obj = Dispatch("get_register_context", error); 1275f757f3fSDimitry Andric 128*0fca6ea1SDimitry Andric if (!ScriptedInterface::CheckStructuredDataObject(LLVM_PRETTY_FUNCTION, obj, 129*0fca6ea1SDimitry Andric error)) 1305f757f3fSDimitry Andric return {}; 1315f757f3fSDimitry Andric 1325f757f3fSDimitry Andric return obj->GetAsString()->GetValue().str(); 1335f757f3fSDimitry Andric } 1345f757f3fSDimitry Andric 1355f757f3fSDimitry Andric StructuredData::ArraySP ScriptedThreadPythonInterface::GetExtendedInfo() { 1365f757f3fSDimitry Andric Status error; 1375f757f3fSDimitry Andric StructuredData::ArraySP arr = 1385f757f3fSDimitry Andric Dispatch<StructuredData::ArraySP>("get_extended_info", error); 1395f757f3fSDimitry Andric 140*0fca6ea1SDimitry Andric if (!ScriptedInterface::CheckStructuredDataObject(LLVM_PRETTY_FUNCTION, arr, 141*0fca6ea1SDimitry Andric error)) 1425f757f3fSDimitry Andric return {}; 1435f757f3fSDimitry Andric 1445f757f3fSDimitry Andric return arr; 1455f757f3fSDimitry Andric } 1465f757f3fSDimitry Andric 1475f757f3fSDimitry Andric #endif 148