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"
1077374d3bSMed Ismail Bennani #include "lldb/Utility/Log.h"
1177374d3bSMed Ismail Bennani #include "lldb/lldb-enumerations.h"
1277374d3bSMed Ismail Bennani 
1377374d3bSMed Ismail Bennani #if LLDB_ENABLE_PYTHON
1477374d3bSMed Ismail Bennani 
1577374d3bSMed Ismail Bennani // LLDB Python header must be included first
1677374d3bSMed Ismail Bennani #include "../lldb-python.h"
1777374d3bSMed Ismail Bennani 
1877374d3bSMed Ismail Bennani #include "../SWIGPythonBridge.h"
1977374d3bSMed Ismail Bennani #include "../ScriptInterpreterPythonImpl.h"
2077374d3bSMed Ismail Bennani #include "ScriptedThreadPythonInterface.h"
2177374d3bSMed Ismail Bennani #include <optional>
2277374d3bSMed Ismail Bennani 
2377374d3bSMed Ismail Bennani using namespace lldb;
2477374d3bSMed Ismail Bennani using namespace lldb_private;
2577374d3bSMed Ismail Bennani using namespace lldb_private::python;
2677374d3bSMed Ismail Bennani using Locker = ScriptInterpreterPythonImpl::Locker;
2777374d3bSMed Ismail Bennani 
2877374d3bSMed Ismail Bennani ScriptedThreadPythonInterface::ScriptedThreadPythonInterface(
2977374d3bSMed Ismail Bennani     ScriptInterpreterPythonImpl &interpreter)
3077374d3bSMed Ismail Bennani     : ScriptedThreadInterface(), ScriptedPythonInterface(interpreter) {}
3177374d3bSMed Ismail Bennani 
32*f22d82ceSMed Ismail Bennani llvm::Expected<StructuredData::GenericSP>
33*f22d82ceSMed Ismail Bennani ScriptedThreadPythonInterface::CreatePluginObject(
3477374d3bSMed Ismail Bennani     const llvm::StringRef class_name, ExecutionContext &exe_ctx,
3577374d3bSMed Ismail Bennani     StructuredData::DictionarySP args_sp, StructuredData::Generic *script_obj) {
36*f22d82ceSMed Ismail Bennani   ExecutionContextRefSP exe_ctx_ref_sp =
3777374d3bSMed Ismail Bennani       std::make_shared<ExecutionContextRef>(exe_ctx);
38*f22d82ceSMed Ismail Bennani   StructuredDataImpl sd_impl(args_sp);
39*f22d82ceSMed Ismail Bennani   return ScriptedPythonInterface::CreatePluginObject(class_name, script_obj,
40*f22d82ceSMed Ismail Bennani                                                      exe_ctx_ref_sp, sd_impl);
4177374d3bSMed Ismail Bennani }
4277374d3bSMed Ismail Bennani 
4377374d3bSMed Ismail Bennani lldb::tid_t ScriptedThreadPythonInterface::GetThreadID() {
4477374d3bSMed Ismail Bennani   Status error;
4577374d3bSMed Ismail Bennani   StructuredData::ObjectSP obj = Dispatch("get_thread_id", error);
4677374d3bSMed Ismail Bennani 
4777374d3bSMed Ismail Bennani   if (!CheckStructuredDataObject(LLVM_PRETTY_FUNCTION, obj, error))
4877374d3bSMed Ismail Bennani     return LLDB_INVALID_THREAD_ID;
4977374d3bSMed Ismail Bennani 
5077374d3bSMed Ismail Bennani   return obj->GetUnsignedIntegerValue(LLDB_INVALID_THREAD_ID);
5177374d3bSMed Ismail Bennani }
5277374d3bSMed Ismail Bennani 
5377374d3bSMed Ismail Bennani std::optional<std::string> ScriptedThreadPythonInterface::GetName() {
5477374d3bSMed Ismail Bennani   Status error;
5577374d3bSMed Ismail Bennani   StructuredData::ObjectSP obj = Dispatch("get_name", error);
5677374d3bSMed Ismail Bennani 
5777374d3bSMed Ismail Bennani   if (!CheckStructuredDataObject(LLVM_PRETTY_FUNCTION, obj, error))
5877374d3bSMed Ismail Bennani     return {};
5977374d3bSMed Ismail Bennani 
6077374d3bSMed Ismail Bennani   return obj->GetStringValue().str();
6177374d3bSMed Ismail Bennani }
6277374d3bSMed Ismail Bennani 
6377374d3bSMed Ismail Bennani lldb::StateType ScriptedThreadPythonInterface::GetState() {
6477374d3bSMed Ismail Bennani   Status error;
6577374d3bSMed Ismail Bennani   StructuredData::ObjectSP obj = Dispatch("get_state", error);
6677374d3bSMed Ismail Bennani 
6777374d3bSMed Ismail Bennani   if (!CheckStructuredDataObject(LLVM_PRETTY_FUNCTION, obj, error))
6877374d3bSMed Ismail Bennani     return eStateInvalid;
6977374d3bSMed Ismail Bennani 
7077374d3bSMed Ismail Bennani   return static_cast<StateType>(obj->GetUnsignedIntegerValue(eStateInvalid));
7177374d3bSMed Ismail Bennani }
7277374d3bSMed Ismail Bennani 
7377374d3bSMed Ismail Bennani std::optional<std::string> ScriptedThreadPythonInterface::GetQueue() {
7477374d3bSMed Ismail Bennani   Status error;
7577374d3bSMed Ismail Bennani   StructuredData::ObjectSP obj = Dispatch("get_queue", error);
7677374d3bSMed Ismail Bennani 
7777374d3bSMed Ismail Bennani   if (!CheckStructuredDataObject(LLVM_PRETTY_FUNCTION, obj, error))
7877374d3bSMed Ismail Bennani     return {};
7977374d3bSMed Ismail Bennani 
8077374d3bSMed Ismail Bennani   return obj->GetStringValue().str();
8177374d3bSMed Ismail Bennani }
8277374d3bSMed Ismail Bennani 
8377374d3bSMed Ismail Bennani StructuredData::DictionarySP ScriptedThreadPythonInterface::GetStopReason() {
8477374d3bSMed Ismail Bennani   Status error;
8577374d3bSMed Ismail Bennani   StructuredData::DictionarySP dict =
8677374d3bSMed Ismail Bennani       Dispatch<StructuredData::DictionarySP>("get_stop_reason", error);
8777374d3bSMed Ismail Bennani 
8877374d3bSMed Ismail Bennani   if (!CheckStructuredDataObject(LLVM_PRETTY_FUNCTION, dict, error))
8977374d3bSMed Ismail Bennani     return {};
9077374d3bSMed Ismail Bennani 
9177374d3bSMed Ismail Bennani   return dict;
9277374d3bSMed Ismail Bennani }
9377374d3bSMed Ismail Bennani 
9477374d3bSMed Ismail Bennani StructuredData::ArraySP ScriptedThreadPythonInterface::GetStackFrames() {
9577374d3bSMed Ismail Bennani   Status error;
9677374d3bSMed Ismail Bennani   StructuredData::ArraySP arr =
9777374d3bSMed Ismail Bennani       Dispatch<StructuredData::ArraySP>("get_stackframes", error);
9877374d3bSMed Ismail Bennani 
9977374d3bSMed Ismail Bennani   if (!CheckStructuredDataObject(LLVM_PRETTY_FUNCTION, arr, error))
10077374d3bSMed Ismail Bennani     return {};
10177374d3bSMed Ismail Bennani 
10277374d3bSMed Ismail Bennani   return arr;
10377374d3bSMed Ismail Bennani }
10477374d3bSMed Ismail Bennani 
10577374d3bSMed Ismail Bennani StructuredData::DictionarySP ScriptedThreadPythonInterface::GetRegisterInfo() {
10677374d3bSMed Ismail Bennani   Status error;
10777374d3bSMed Ismail Bennani   StructuredData::DictionarySP dict =
10877374d3bSMed Ismail Bennani       Dispatch<StructuredData::DictionarySP>("get_register_info", error);
10977374d3bSMed Ismail Bennani 
11077374d3bSMed Ismail Bennani   if (!CheckStructuredDataObject(LLVM_PRETTY_FUNCTION, dict, error))
11177374d3bSMed Ismail Bennani     return {};
11277374d3bSMed Ismail Bennani 
11377374d3bSMed Ismail Bennani   return dict;
11477374d3bSMed Ismail Bennani }
11577374d3bSMed Ismail Bennani 
11677374d3bSMed Ismail Bennani std::optional<std::string> ScriptedThreadPythonInterface::GetRegisterContext() {
11777374d3bSMed Ismail Bennani   Status error;
11877374d3bSMed Ismail Bennani   StructuredData::ObjectSP obj = Dispatch("get_register_context", error);
11977374d3bSMed Ismail Bennani 
12077374d3bSMed Ismail Bennani   if (!CheckStructuredDataObject(LLVM_PRETTY_FUNCTION, obj, error))
12177374d3bSMed Ismail Bennani     return {};
12277374d3bSMed Ismail Bennani 
12377374d3bSMed Ismail Bennani   return obj->GetAsString()->GetValue().str();
12477374d3bSMed Ismail Bennani }
12577374d3bSMed Ismail Bennani 
12677374d3bSMed Ismail Bennani StructuredData::ArraySP ScriptedThreadPythonInterface::GetExtendedInfo() {
12777374d3bSMed Ismail Bennani   Status error;
12877374d3bSMed Ismail Bennani   StructuredData::ArraySP arr =
12977374d3bSMed Ismail Bennani       Dispatch<StructuredData::ArraySP>("get_extended_info", error);
13077374d3bSMed Ismail Bennani 
13177374d3bSMed Ismail Bennani   if (!CheckStructuredDataObject(LLVM_PRETTY_FUNCTION, arr, error))
13277374d3bSMed Ismail Bennani     return {};
13377374d3bSMed Ismail Bennani 
13477374d3bSMed Ismail Bennani   return arr;
13577374d3bSMed Ismail Bennani }
13677374d3bSMed Ismail Bennani 
13777374d3bSMed Ismail Bennani #endif
138