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