177374d3bSMed Ismail Bennani //===-- ScriptedThreadPythonInterface.cpp ---------------------------------===//
277374d3bSMed Ismail Bennani //
377374d3bSMed Ismail Bennani // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
477374d3bSMed Ismail Bennani // See https://llvm.org/LICENSE.txt for license information.
577374d3bSMed Ismail Bennani // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
677374d3bSMed Ismail Bennani //
777374d3bSMed Ismail Bennani //===----------------------------------------------------------------------===//
877374d3bSMed Ismail Bennani 
977374d3bSMed Ismail Bennani #include "lldb/Host/Config.h"
10*9a9ec228SMed Ismail Bennani #include "lldb/Target/ExecutionContext.h"
1177374d3bSMed Ismail Bennani #include "lldb/Utility/Log.h"
1277374d3bSMed Ismail Bennani #include "lldb/lldb-enumerations.h"
1377374d3bSMed Ismail Bennani 
1477374d3bSMed Ismail Bennani #if LLDB_ENABLE_PYTHON
1577374d3bSMed Ismail Bennani 
1677374d3bSMed Ismail Bennani // LLDB Python header must be included first
1777374d3bSMed Ismail Bennani #include "../lldb-python.h"
1877374d3bSMed Ismail Bennani 
1977374d3bSMed Ismail Bennani #include "../SWIGPythonBridge.h"
2077374d3bSMed Ismail Bennani #include "../ScriptInterpreterPythonImpl.h"
2177374d3bSMed Ismail Bennani #include "ScriptedThreadPythonInterface.h"
2277374d3bSMed Ismail Bennani #include <optional>
2377374d3bSMed Ismail Bennani 
2477374d3bSMed Ismail Bennani using namespace lldb;
2577374d3bSMed Ismail Bennani using namespace lldb_private;
2677374d3bSMed Ismail Bennani using namespace lldb_private::python;
2777374d3bSMed Ismail Bennani using Locker = ScriptInterpreterPythonImpl::Locker;
2877374d3bSMed Ismail Bennani 
ScriptedThreadPythonInterface(ScriptInterpreterPythonImpl & interpreter)2977374d3bSMed Ismail Bennani ScriptedThreadPythonInterface::ScriptedThreadPythonInterface(
3077374d3bSMed Ismail Bennani     ScriptInterpreterPythonImpl &interpreter)
3177374d3bSMed Ismail Bennani     : ScriptedThreadInterface(), ScriptedPythonInterface(interpreter) {}
3277374d3bSMed Ismail Bennani 
33f22d82ceSMed Ismail Bennani llvm::Expected<StructuredData::GenericSP>
CreatePluginObject(const llvm::StringRef class_name,ExecutionContext & exe_ctx,StructuredData::DictionarySP args_sp,StructuredData::Generic * script_obj)34f22d82ceSMed Ismail Bennani ScriptedThreadPythonInterface::CreatePluginObject(
3577374d3bSMed Ismail Bennani     const llvm::StringRef class_name, ExecutionContext &exe_ctx,
3677374d3bSMed Ismail Bennani     StructuredData::DictionarySP args_sp, StructuredData::Generic *script_obj) {
37f22d82ceSMed Ismail Bennani   ExecutionContextRefSP exe_ctx_ref_sp =
3877374d3bSMed Ismail Bennani       std::make_shared<ExecutionContextRef>(exe_ctx);
39f22d82ceSMed Ismail Bennani   StructuredDataImpl sd_impl(args_sp);
40f22d82ceSMed Ismail Bennani   return ScriptedPythonInterface::CreatePluginObject(class_name, script_obj,
41f22d82ceSMed Ismail Bennani                                                      exe_ctx_ref_sp, sd_impl);
4277374d3bSMed Ismail Bennani }
4377374d3bSMed Ismail Bennani 
GetThreadID()4477374d3bSMed Ismail Bennani lldb::tid_t ScriptedThreadPythonInterface::GetThreadID() {
4577374d3bSMed Ismail Bennani   Status error;
4677374d3bSMed Ismail Bennani   StructuredData::ObjectSP obj = Dispatch("get_thread_id", error);
4777374d3bSMed Ismail Bennani 
48*9a9ec228SMed Ismail Bennani   if (!ScriptedInterface::CheckStructuredDataObject(LLVM_PRETTY_FUNCTION, obj,
49*9a9ec228SMed Ismail Bennani                                                     error))
5077374d3bSMed Ismail Bennani     return LLDB_INVALID_THREAD_ID;
5177374d3bSMed Ismail Bennani 
5277374d3bSMed Ismail Bennani   return obj->GetUnsignedIntegerValue(LLDB_INVALID_THREAD_ID);
5377374d3bSMed Ismail Bennani }
5477374d3bSMed Ismail Bennani 
GetName()5577374d3bSMed Ismail Bennani std::optional<std::string> ScriptedThreadPythonInterface::GetName() {
5677374d3bSMed Ismail Bennani   Status error;
5777374d3bSMed Ismail Bennani   StructuredData::ObjectSP obj = Dispatch("get_name", error);
5877374d3bSMed Ismail Bennani 
59*9a9ec228SMed Ismail Bennani   if (!ScriptedInterface::CheckStructuredDataObject(LLVM_PRETTY_FUNCTION, obj,
60*9a9ec228SMed Ismail Bennani                                                     error))
6177374d3bSMed Ismail Bennani     return {};
6277374d3bSMed Ismail Bennani 
6377374d3bSMed Ismail Bennani   return obj->GetStringValue().str();
6477374d3bSMed Ismail Bennani }
6577374d3bSMed Ismail Bennani 
GetState()6677374d3bSMed Ismail Bennani lldb::StateType ScriptedThreadPythonInterface::GetState() {
6777374d3bSMed Ismail Bennani   Status error;
6877374d3bSMed Ismail Bennani   StructuredData::ObjectSP obj = Dispatch("get_state", error);
6977374d3bSMed Ismail Bennani 
70*9a9ec228SMed Ismail Bennani   if (!ScriptedInterface::CheckStructuredDataObject(LLVM_PRETTY_FUNCTION, obj,
71*9a9ec228SMed Ismail Bennani                                                     error))
7277374d3bSMed Ismail Bennani     return eStateInvalid;
7377374d3bSMed Ismail Bennani 
7477374d3bSMed Ismail Bennani   return static_cast<StateType>(obj->GetUnsignedIntegerValue(eStateInvalid));
7577374d3bSMed Ismail Bennani }
7677374d3bSMed Ismail Bennani 
GetQueue()7777374d3bSMed Ismail Bennani std::optional<std::string> ScriptedThreadPythonInterface::GetQueue() {
7877374d3bSMed Ismail Bennani   Status error;
7977374d3bSMed Ismail Bennani   StructuredData::ObjectSP obj = Dispatch("get_queue", error);
8077374d3bSMed Ismail Bennani 
81*9a9ec228SMed Ismail Bennani   if (!ScriptedInterface::CheckStructuredDataObject(LLVM_PRETTY_FUNCTION, obj,
82*9a9ec228SMed Ismail Bennani                                                     error))
8377374d3bSMed Ismail Bennani     return {};
8477374d3bSMed Ismail Bennani 
8577374d3bSMed Ismail Bennani   return obj->GetStringValue().str();
8677374d3bSMed Ismail Bennani }
8777374d3bSMed Ismail Bennani 
GetStopReason()8877374d3bSMed Ismail Bennani StructuredData::DictionarySP ScriptedThreadPythonInterface::GetStopReason() {
8977374d3bSMed Ismail Bennani   Status error;
9077374d3bSMed Ismail Bennani   StructuredData::DictionarySP dict =
9177374d3bSMed Ismail Bennani       Dispatch<StructuredData::DictionarySP>("get_stop_reason", error);
9277374d3bSMed Ismail Bennani 
93*9a9ec228SMed Ismail Bennani   if (!ScriptedInterface::CheckStructuredDataObject(LLVM_PRETTY_FUNCTION, dict,
94*9a9ec228SMed Ismail Bennani                                                     error))
9577374d3bSMed Ismail Bennani     return {};
9677374d3bSMed Ismail Bennani 
9777374d3bSMed Ismail Bennani   return dict;
9877374d3bSMed Ismail Bennani }
9977374d3bSMed Ismail Bennani 
GetStackFrames()10077374d3bSMed Ismail Bennani StructuredData::ArraySP ScriptedThreadPythonInterface::GetStackFrames() {
10177374d3bSMed Ismail Bennani   Status error;
10277374d3bSMed Ismail Bennani   StructuredData::ArraySP arr =
10377374d3bSMed Ismail Bennani       Dispatch<StructuredData::ArraySP>("get_stackframes", error);
10477374d3bSMed Ismail Bennani 
105*9a9ec228SMed Ismail Bennani   if (!ScriptedInterface::CheckStructuredDataObject(LLVM_PRETTY_FUNCTION, arr,
106*9a9ec228SMed Ismail Bennani                                                     error))
10777374d3bSMed Ismail Bennani     return {};
10877374d3bSMed Ismail Bennani 
10977374d3bSMed Ismail Bennani   return arr;
11077374d3bSMed Ismail Bennani }
11177374d3bSMed Ismail Bennani 
GetRegisterInfo()11277374d3bSMed Ismail Bennani StructuredData::DictionarySP ScriptedThreadPythonInterface::GetRegisterInfo() {
11377374d3bSMed Ismail Bennani   Status error;
11477374d3bSMed Ismail Bennani   StructuredData::DictionarySP dict =
11577374d3bSMed Ismail Bennani       Dispatch<StructuredData::DictionarySP>("get_register_info", error);
11677374d3bSMed Ismail Bennani 
117*9a9ec228SMed Ismail Bennani   if (!ScriptedInterface::CheckStructuredDataObject(LLVM_PRETTY_FUNCTION, dict,
118*9a9ec228SMed Ismail Bennani                                                     error))
11977374d3bSMed Ismail Bennani     return {};
12077374d3bSMed Ismail Bennani 
12177374d3bSMed Ismail Bennani   return dict;
12277374d3bSMed Ismail Bennani }
12377374d3bSMed Ismail Bennani 
GetRegisterContext()12477374d3bSMed Ismail Bennani std::optional<std::string> ScriptedThreadPythonInterface::GetRegisterContext() {
12577374d3bSMed Ismail Bennani   Status error;
12677374d3bSMed Ismail Bennani   StructuredData::ObjectSP obj = Dispatch("get_register_context", error);
12777374d3bSMed Ismail Bennani 
128*9a9ec228SMed Ismail Bennani   if (!ScriptedInterface::CheckStructuredDataObject(LLVM_PRETTY_FUNCTION, obj,
129*9a9ec228SMed Ismail Bennani                                                     error))
13077374d3bSMed Ismail Bennani     return {};
13177374d3bSMed Ismail Bennani 
13277374d3bSMed Ismail Bennani   return obj->GetAsString()->GetValue().str();
13377374d3bSMed Ismail Bennani }
13477374d3bSMed Ismail Bennani 
GetExtendedInfo()13577374d3bSMed Ismail Bennani StructuredData::ArraySP ScriptedThreadPythonInterface::GetExtendedInfo() {
13677374d3bSMed Ismail Bennani   Status error;
13777374d3bSMed Ismail Bennani   StructuredData::ArraySP arr =
13877374d3bSMed Ismail Bennani       Dispatch<StructuredData::ArraySP>("get_extended_info", error);
13977374d3bSMed Ismail Bennani 
140*9a9ec228SMed Ismail Bennani   if (!ScriptedInterface::CheckStructuredDataObject(LLVM_PRETTY_FUNCTION, arr,
141*9a9ec228SMed Ismail Bennani                                                     error))
14277374d3bSMed Ismail Bennani     return {};
14377374d3bSMed Ismail Bennani 
14477374d3bSMed Ismail Bennani   return arr;
14577374d3bSMed Ismail Bennani }
14677374d3bSMed Ismail Bennani 
14777374d3bSMed Ismail Bennani #endif
148