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