159d8dd79SMed Ismail Bennani //===-- ScriptedThreadPythonInterface.cpp ---------------------------------===//
259d8dd79SMed Ismail Bennani //
359d8dd79SMed Ismail Bennani // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
459d8dd79SMed Ismail Bennani // See https://llvm.org/LICENSE.txt for license information.
559d8dd79SMed Ismail Bennani // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
659d8dd79SMed Ismail Bennani //
759d8dd79SMed Ismail Bennani //===----------------------------------------------------------------------===//
859d8dd79SMed Ismail Bennani
959d8dd79SMed Ismail Bennani #include "lldb/Host/Config.h"
1059d8dd79SMed Ismail Bennani #include "lldb/Utility/Log.h"
1159d8dd79SMed Ismail Bennani #include "lldb/lldb-enumerations.h"
1259d8dd79SMed Ismail Bennani
1359d8dd79SMed Ismail Bennani #if LLDB_ENABLE_PYTHON
1459d8dd79SMed Ismail Bennani
1559d8dd79SMed Ismail Bennani // LLDB Python header must be included first
1659d8dd79SMed Ismail Bennani #include "lldb-python.h"
1759d8dd79SMed Ismail Bennani
1859d8dd79SMed Ismail Bennani #include "SWIGPythonBridge.h"
1959d8dd79SMed Ismail Bennani #include "ScriptInterpreterPythonImpl.h"
2059d8dd79SMed Ismail Bennani #include "ScriptedThreadPythonInterface.h"
2159d8dd79SMed Ismail Bennani
2259d8dd79SMed Ismail Bennani using namespace lldb;
2359d8dd79SMed Ismail Bennani using namespace lldb_private;
2459d8dd79SMed Ismail Bennani using namespace lldb_private::python;
2559d8dd79SMed Ismail Bennani using Locker = ScriptInterpreterPythonImpl::Locker;
2659d8dd79SMed Ismail Bennani
ScriptedThreadPythonInterface(ScriptInterpreterPythonImpl & interpreter)2759d8dd79SMed Ismail Bennani ScriptedThreadPythonInterface::ScriptedThreadPythonInterface(
2859d8dd79SMed Ismail Bennani ScriptInterpreterPythonImpl &interpreter)
2959d8dd79SMed Ismail Bennani : ScriptedThreadInterface(), ScriptedPythonInterface(interpreter) {}
3059d8dd79SMed Ismail Bennani
CreatePluginObject(const llvm::StringRef class_name,ExecutionContext & exe_ctx,StructuredData::DictionarySP args_sp,StructuredData::Generic * script_obj)3159d8dd79SMed Ismail Bennani StructuredData::GenericSP ScriptedThreadPythonInterface::CreatePluginObject(
3259d8dd79SMed Ismail Bennani const llvm::StringRef class_name, ExecutionContext &exe_ctx,
33d3e0f7e1SMed Ismail Bennani StructuredData::DictionarySP args_sp, StructuredData::Generic *script_obj) {
3445148bfeSMed Ismail Bennani if (class_name.empty() && !script_obj)
3559d8dd79SMed Ismail Bennani return {};
3659d8dd79SMed Ismail Bennani
37738621d0SMed Ismail Bennani ProcessSP process_sp = exe_ctx.GetProcessSP();
3882de8df2SPavel Labath StructuredDataImpl args_impl(args_sp);
39738621d0SMed Ismail Bennani std::string error_string;
40738621d0SMed Ismail Bennani
4159d8dd79SMed Ismail Bennani Locker py_lock(&m_interpreter, Locker::AcquireLock | Locker::NoSTDIN,
4259d8dd79SMed Ismail Bennani Locker::FreeLock);
4359d8dd79SMed Ismail Bennani
44d3e0f7e1SMed Ismail Bennani PythonObject ret_val;
45d3e0f7e1SMed Ismail Bennani
46d3e0f7e1SMed Ismail Bennani if (!script_obj)
47d3e0f7e1SMed Ismail Bennani ret_val = LLDBSwigPythonCreateScriptedThread(
48738621d0SMed Ismail Bennani class_name.str().c_str(), m_interpreter.GetDictionaryName(), process_sp,
49738621d0SMed Ismail Bennani args_impl, error_string);
50d3e0f7e1SMed Ismail Bennani else
51d3e0f7e1SMed Ismail Bennani ret_val = PythonObject(PyRefType::Borrowed,
52d3e0f7e1SMed Ismail Bennani static_cast<PyObject *>(script_obj->GetValue()));
5359d8dd79SMed Ismail Bennani
5459d8dd79SMed Ismail Bennani if (!ret_val)
5559d8dd79SMed Ismail Bennani return {};
5659d8dd79SMed Ismail Bennani
5759d8dd79SMed Ismail Bennani m_object_instance_sp =
58c154f397SPavel Labath StructuredData::GenericSP(new StructuredPythonObject(std::move(ret_val)));
5959d8dd79SMed Ismail Bennani
6059d8dd79SMed Ismail Bennani return m_object_instance_sp;
6159d8dd79SMed Ismail Bennani }
6259d8dd79SMed Ismail Bennani
GetThreadID()6359d8dd79SMed Ismail Bennani lldb::tid_t ScriptedThreadPythonInterface::GetThreadID() {
6459d8dd79SMed Ismail Bennani Status error;
6559d8dd79SMed Ismail Bennani StructuredData::ObjectSP obj = Dispatch("get_thread_id", error);
6659d8dd79SMed Ismail Bennani
6788a941baSMed Ismail Bennani if (!CheckStructuredDataObject(LLVM_PRETTY_FUNCTION, obj, error))
6859d8dd79SMed Ismail Bennani return LLDB_INVALID_THREAD_ID;
6959d8dd79SMed Ismail Bennani
7059d8dd79SMed Ismail Bennani return obj->GetIntegerValue(LLDB_INVALID_THREAD_ID);
7159d8dd79SMed Ismail Bennani }
7259d8dd79SMed Ismail Bennani
GetName()7359d8dd79SMed Ismail Bennani llvm::Optional<std::string> ScriptedThreadPythonInterface::GetName() {
7459d8dd79SMed Ismail Bennani Status error;
7559d8dd79SMed Ismail Bennani StructuredData::ObjectSP obj = Dispatch("get_name", error);
7659d8dd79SMed Ismail Bennani
7788a941baSMed Ismail Bennani if (!CheckStructuredDataObject(LLVM_PRETTY_FUNCTION, obj, error))
7859d8dd79SMed Ismail Bennani return {};
7959d8dd79SMed Ismail Bennani
8059d8dd79SMed Ismail Bennani return obj->GetStringValue().str();
8159d8dd79SMed Ismail Bennani }
8259d8dd79SMed Ismail Bennani
GetState()8359d8dd79SMed Ismail Bennani lldb::StateType ScriptedThreadPythonInterface::GetState() {
8459d8dd79SMed Ismail Bennani Status error;
8559d8dd79SMed Ismail Bennani StructuredData::ObjectSP obj = Dispatch("get_state", error);
8659d8dd79SMed Ismail Bennani
8788a941baSMed Ismail Bennani if (!CheckStructuredDataObject(LLVM_PRETTY_FUNCTION, obj, error))
8859d8dd79SMed Ismail Bennani return eStateInvalid;
8959d8dd79SMed Ismail Bennani
9059d8dd79SMed Ismail Bennani return static_cast<StateType>(obj->GetIntegerValue(eStateInvalid));
9159d8dd79SMed Ismail Bennani }
9259d8dd79SMed Ismail Bennani
GetQueue()9359d8dd79SMed Ismail Bennani llvm::Optional<std::string> ScriptedThreadPythonInterface::GetQueue() {
9459d8dd79SMed Ismail Bennani Status error;
9559d8dd79SMed Ismail Bennani StructuredData::ObjectSP obj = Dispatch("get_queue", error);
9659d8dd79SMed Ismail Bennani
9788a941baSMed Ismail Bennani if (!CheckStructuredDataObject(LLVM_PRETTY_FUNCTION, obj, error))
9859d8dd79SMed Ismail Bennani return {};
9959d8dd79SMed Ismail Bennani
10059d8dd79SMed Ismail Bennani return obj->GetStringValue().str();
10159d8dd79SMed Ismail Bennani }
10259d8dd79SMed Ismail Bennani
GetStopReason()10359d8dd79SMed Ismail Bennani StructuredData::DictionarySP ScriptedThreadPythonInterface::GetStopReason() {
10459d8dd79SMed Ismail Bennani Status error;
10559d8dd79SMed Ismail Bennani StructuredData::DictionarySP dict =
10659d8dd79SMed Ismail Bennani Dispatch<StructuredData::DictionarySP>("get_stop_reason", error);
10759d8dd79SMed Ismail Bennani
10888a941baSMed Ismail Bennani if (!CheckStructuredDataObject(LLVM_PRETTY_FUNCTION, dict, error))
10959d8dd79SMed Ismail Bennani return {};
11059d8dd79SMed Ismail Bennani
11159d8dd79SMed Ismail Bennani return dict;
11259d8dd79SMed Ismail Bennani }
11359d8dd79SMed Ismail Bennani
GetStackFrames()11459d8dd79SMed Ismail Bennani StructuredData::ArraySP ScriptedThreadPythonInterface::GetStackFrames() {
115*70665844SMed Ismail Bennani Status error;
116*70665844SMed Ismail Bennani StructuredData::ArraySP arr =
117*70665844SMed Ismail Bennani Dispatch<StructuredData::ArraySP>("get_stackframes", error);
118*70665844SMed Ismail Bennani
119*70665844SMed Ismail Bennani if (!CheckStructuredDataObject(LLVM_PRETTY_FUNCTION, arr, error))
120*70665844SMed Ismail Bennani return {};
121*70665844SMed Ismail Bennani
122*70665844SMed Ismail Bennani return arr;
12359d8dd79SMed Ismail Bennani }
12459d8dd79SMed Ismail Bennani
GetRegisterInfo()12559d8dd79SMed Ismail Bennani StructuredData::DictionarySP ScriptedThreadPythonInterface::GetRegisterInfo() {
12659d8dd79SMed Ismail Bennani Status error;
12759d8dd79SMed Ismail Bennani StructuredData::DictionarySP dict =
12859d8dd79SMed Ismail Bennani Dispatch<StructuredData::DictionarySP>("get_register_info", error);
12959d8dd79SMed Ismail Bennani
13088a941baSMed Ismail Bennani if (!CheckStructuredDataObject(LLVM_PRETTY_FUNCTION, dict, error))
13159d8dd79SMed Ismail Bennani return {};
13259d8dd79SMed Ismail Bennani
13359d8dd79SMed Ismail Bennani return dict;
13459d8dd79SMed Ismail Bennani }
13559d8dd79SMed Ismail Bennani
13659d8dd79SMed Ismail Bennani llvm::Optional<std::string>
GetRegisterContext()13759d8dd79SMed Ismail Bennani ScriptedThreadPythonInterface::GetRegisterContext() {
13859d8dd79SMed Ismail Bennani Status error;
13959d8dd79SMed Ismail Bennani StructuredData::ObjectSP obj = Dispatch("get_register_context", error);
14059d8dd79SMed Ismail Bennani
14188a941baSMed Ismail Bennani if (!CheckStructuredDataObject(LLVM_PRETTY_FUNCTION, obj, error))
14259d8dd79SMed Ismail Bennani return {};
14359d8dd79SMed Ismail Bennani
14459d8dd79SMed Ismail Bennani return obj->GetAsString()->GetValue().str();
14559d8dd79SMed Ismail Bennani }
14659d8dd79SMed Ismail Bennani
14759d8dd79SMed Ismail Bennani #endif
148