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>(exe_ctx);
39    StructuredDataImpl sd_impl(args_sp);
40    return ScriptedPythonInterface::CreatePluginObject(class_name, script_obj,
41                                                       exe_ctx_ref_sp, sd_impl);
42  }
43  
44  lldb::tid_t ScriptedThreadPythonInterface::GetThreadID() {
45    Status error;
46    StructuredData::ObjectSP obj = Dispatch("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("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("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(eStateInvalid));
75  }
76  
77  std::optional<std::string> ScriptedThreadPythonInterface::GetQueue() {
78    Status error;
79    StructuredData::ObjectSP obj = Dispatch("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>("get_stop_reason", error);
92  
93    if (!ScriptedInterface::CheckStructuredDataObject(LLVM_PRETTY_FUNCTION, 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>("get_stackframes", error);
104  
105    if (!ScriptedInterface::CheckStructuredDataObject(LLVM_PRETTY_FUNCTION, 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>("get_register_info", error);
116  
117    if (!ScriptedInterface::CheckStructuredDataObject(LLVM_PRETTY_FUNCTION, 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("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>("get_extended_info", error);
139  
140    if (!ScriptedInterface::CheckStructuredDataObject(LLVM_PRETTY_FUNCTION, arr,
141                                                      error))
142      return {};
143  
144    return arr;
145  }
146  
147  #endif
148