1 //===-- ScriptedThreadPythonInterface.cpp ---------------------------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #include "lldb/Host/Config.h" 10 #include "lldb/Utility/Log.h" 11 #include "lldb/lldb-enumerations.h" 12 13 #if LLDB_ENABLE_PYTHON 14 15 // LLDB Python header must be included first 16 #include "../lldb-python.h" 17 18 #include "../SWIGPythonBridge.h" 19 #include "../ScriptInterpreterPythonImpl.h" 20 #include "ScriptedThreadPythonInterface.h" 21 #include <optional> 22 23 using namespace lldb; 24 using namespace lldb_private; 25 using namespace lldb_private::python; 26 using Locker = ScriptInterpreterPythonImpl::Locker; 27 28 ScriptedThreadPythonInterface::ScriptedThreadPythonInterface( 29 ScriptInterpreterPythonImpl &interpreter) 30 : ScriptedThreadInterface(), ScriptedPythonInterface(interpreter) {} 31 32 llvm::Expected<StructuredData::GenericSP> 33 ScriptedThreadPythonInterface::CreatePluginObject( 34 const llvm::StringRef class_name, ExecutionContext &exe_ctx, 35 StructuredData::DictionarySP args_sp, StructuredData::Generic *script_obj) { 36 ExecutionContextRefSP exe_ctx_ref_sp = 37 std::make_shared<ExecutionContextRef>(exe_ctx); 38 StructuredDataImpl sd_impl(args_sp); 39 return ScriptedPythonInterface::CreatePluginObject(class_name, script_obj, 40 exe_ctx_ref_sp, sd_impl); 41 } 42 43 lldb::tid_t ScriptedThreadPythonInterface::GetThreadID() { 44 Status error; 45 StructuredData::ObjectSP obj = Dispatch("get_thread_id", error); 46 47 if (!CheckStructuredDataObject(LLVM_PRETTY_FUNCTION, obj, error)) 48 return LLDB_INVALID_THREAD_ID; 49 50 return obj->GetUnsignedIntegerValue(LLDB_INVALID_THREAD_ID); 51 } 52 53 std::optional<std::string> ScriptedThreadPythonInterface::GetName() { 54 Status error; 55 StructuredData::ObjectSP obj = Dispatch("get_name", error); 56 57 if (!CheckStructuredDataObject(LLVM_PRETTY_FUNCTION, obj, error)) 58 return {}; 59 60 return obj->GetStringValue().str(); 61 } 62 63 lldb::StateType ScriptedThreadPythonInterface::GetState() { 64 Status error; 65 StructuredData::ObjectSP obj = Dispatch("get_state", error); 66 67 if (!CheckStructuredDataObject(LLVM_PRETTY_FUNCTION, obj, error)) 68 return eStateInvalid; 69 70 return static_cast<StateType>(obj->GetUnsignedIntegerValue(eStateInvalid)); 71 } 72 73 std::optional<std::string> ScriptedThreadPythonInterface::GetQueue() { 74 Status error; 75 StructuredData::ObjectSP obj = Dispatch("get_queue", error); 76 77 if (!CheckStructuredDataObject(LLVM_PRETTY_FUNCTION, obj, error)) 78 return {}; 79 80 return obj->GetStringValue().str(); 81 } 82 83 StructuredData::DictionarySP ScriptedThreadPythonInterface::GetStopReason() { 84 Status error; 85 StructuredData::DictionarySP dict = 86 Dispatch<StructuredData::DictionarySP>("get_stop_reason", error); 87 88 if (!CheckStructuredDataObject(LLVM_PRETTY_FUNCTION, dict, error)) 89 return {}; 90 91 return dict; 92 } 93 94 StructuredData::ArraySP ScriptedThreadPythonInterface::GetStackFrames() { 95 Status error; 96 StructuredData::ArraySP arr = 97 Dispatch<StructuredData::ArraySP>("get_stackframes", error); 98 99 if (!CheckStructuredDataObject(LLVM_PRETTY_FUNCTION, arr, error)) 100 return {}; 101 102 return arr; 103 } 104 105 StructuredData::DictionarySP ScriptedThreadPythonInterface::GetRegisterInfo() { 106 Status error; 107 StructuredData::DictionarySP dict = 108 Dispatch<StructuredData::DictionarySP>("get_register_info", error); 109 110 if (!CheckStructuredDataObject(LLVM_PRETTY_FUNCTION, dict, error)) 111 return {}; 112 113 return dict; 114 } 115 116 std::optional<std::string> ScriptedThreadPythonInterface::GetRegisterContext() { 117 Status error; 118 StructuredData::ObjectSP obj = Dispatch("get_register_context", error); 119 120 if (!CheckStructuredDataObject(LLVM_PRETTY_FUNCTION, obj, error)) 121 return {}; 122 123 return obj->GetAsString()->GetValue().str(); 124 } 125 126 StructuredData::ArraySP ScriptedThreadPythonInterface::GetExtendedInfo() { 127 Status error; 128 StructuredData::ArraySP arr = 129 Dispatch<StructuredData::ArraySP>("get_extended_info", error); 130 131 if (!CheckStructuredDataObject(LLVM_PRETTY_FUNCTION, arr, error)) 132 return {}; 133 134 return arr; 135 } 136 137 #endif 138