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