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/Utility/Logging.h"
1259d8dd79SMed Ismail Bennani #include "lldb/lldb-enumerations.h"
1359d8dd79SMed Ismail Bennani 
1459d8dd79SMed Ismail Bennani #if LLDB_ENABLE_PYTHON
1559d8dd79SMed Ismail Bennani 
1659d8dd79SMed Ismail Bennani // LLDB Python header must be included first
1759d8dd79SMed Ismail Bennani #include "lldb-python.h"
1859d8dd79SMed Ismail Bennani 
1959d8dd79SMed Ismail Bennani #include "SWIGPythonBridge.h"
2059d8dd79SMed Ismail Bennani #include "ScriptInterpreterPythonImpl.h"
2159d8dd79SMed Ismail Bennani #include "ScriptedThreadPythonInterface.h"
2259d8dd79SMed Ismail Bennani 
2359d8dd79SMed Ismail Bennani using namespace lldb;
2459d8dd79SMed Ismail Bennani using namespace lldb_private;
2559d8dd79SMed Ismail Bennani using namespace lldb_private::python;
2659d8dd79SMed Ismail Bennani using Locker = ScriptInterpreterPythonImpl::Locker;
2759d8dd79SMed Ismail Bennani 
2859d8dd79SMed Ismail Bennani ScriptedThreadPythonInterface::ScriptedThreadPythonInterface(
2959d8dd79SMed Ismail Bennani     ScriptInterpreterPythonImpl &interpreter)
3059d8dd79SMed Ismail Bennani     : ScriptedThreadInterface(), ScriptedPythonInterface(interpreter) {}
3159d8dd79SMed Ismail Bennani 
3259d8dd79SMed Ismail Bennani StructuredData::GenericSP ScriptedThreadPythonInterface::CreatePluginObject(
3359d8dd79SMed Ismail Bennani     const llvm::StringRef class_name, ExecutionContext &exe_ctx,
3459d8dd79SMed Ismail Bennani     StructuredData::DictionarySP args_sp) {
3559d8dd79SMed Ismail Bennani 
3659d8dd79SMed Ismail Bennani   if (class_name.empty())
3759d8dd79SMed Ismail Bennani     return {};
3859d8dd79SMed Ismail Bennani 
39738621d0SMed Ismail Bennani   ProcessSP process_sp = exe_ctx.GetProcessSP();
40*82de8df2SPavel Labath   StructuredDataImpl args_impl(args_sp);
41738621d0SMed Ismail Bennani   std::string error_string;
42738621d0SMed Ismail Bennani 
4359d8dd79SMed Ismail Bennani   Locker py_lock(&m_interpreter, Locker::AcquireLock | Locker::NoSTDIN,
4459d8dd79SMed Ismail Bennani                  Locker::FreeLock);
4559d8dd79SMed Ismail Bennani 
4659d8dd79SMed Ismail Bennani   void *ret_val = LLDBSwigPythonCreateScriptedThread(
47738621d0SMed Ismail Bennani       class_name.str().c_str(), m_interpreter.GetDictionaryName(), process_sp,
48738621d0SMed Ismail Bennani       args_impl, error_string);
4959d8dd79SMed Ismail Bennani 
5059d8dd79SMed Ismail Bennani   if (!ret_val)
5159d8dd79SMed Ismail Bennani     return {};
5259d8dd79SMed Ismail Bennani 
5359d8dd79SMed Ismail Bennani   m_object_instance_sp =
5459d8dd79SMed Ismail Bennani       StructuredData::GenericSP(new StructuredPythonObject(ret_val));
5559d8dd79SMed Ismail Bennani 
5659d8dd79SMed Ismail Bennani   return m_object_instance_sp;
5759d8dd79SMed Ismail Bennani }
5859d8dd79SMed Ismail Bennani 
5959d8dd79SMed Ismail Bennani lldb::tid_t ScriptedThreadPythonInterface::GetThreadID() {
6059d8dd79SMed Ismail Bennani   Status error;
6159d8dd79SMed Ismail Bennani   StructuredData::ObjectSP obj = Dispatch("get_thread_id", error);
6259d8dd79SMed Ismail Bennani 
6388a941baSMed Ismail Bennani   if (!CheckStructuredDataObject(LLVM_PRETTY_FUNCTION, obj, error))
6459d8dd79SMed Ismail Bennani     return LLDB_INVALID_THREAD_ID;
6559d8dd79SMed Ismail Bennani 
6659d8dd79SMed Ismail Bennani   return obj->GetIntegerValue(LLDB_INVALID_THREAD_ID);
6759d8dd79SMed Ismail Bennani }
6859d8dd79SMed Ismail Bennani 
6959d8dd79SMed Ismail Bennani llvm::Optional<std::string> ScriptedThreadPythonInterface::GetName() {
7059d8dd79SMed Ismail Bennani   Status error;
7159d8dd79SMed Ismail Bennani   StructuredData::ObjectSP obj = Dispatch("get_name", error);
7259d8dd79SMed Ismail Bennani 
7388a941baSMed Ismail Bennani   if (!CheckStructuredDataObject(LLVM_PRETTY_FUNCTION, obj, error))
7459d8dd79SMed Ismail Bennani     return {};
7559d8dd79SMed Ismail Bennani 
7659d8dd79SMed Ismail Bennani   return obj->GetStringValue().str();
7759d8dd79SMed Ismail Bennani }
7859d8dd79SMed Ismail Bennani 
7959d8dd79SMed Ismail Bennani lldb::StateType ScriptedThreadPythonInterface::GetState() {
8059d8dd79SMed Ismail Bennani   Status error;
8159d8dd79SMed Ismail Bennani   StructuredData::ObjectSP obj = Dispatch("get_state", error);
8259d8dd79SMed Ismail Bennani 
8388a941baSMed Ismail Bennani   if (!CheckStructuredDataObject(LLVM_PRETTY_FUNCTION, obj, error))
8459d8dd79SMed Ismail Bennani     return eStateInvalid;
8559d8dd79SMed Ismail Bennani 
8659d8dd79SMed Ismail Bennani   return static_cast<StateType>(obj->GetIntegerValue(eStateInvalid));
8759d8dd79SMed Ismail Bennani }
8859d8dd79SMed Ismail Bennani 
8959d8dd79SMed Ismail Bennani llvm::Optional<std::string> ScriptedThreadPythonInterface::GetQueue() {
9059d8dd79SMed Ismail Bennani   Status error;
9159d8dd79SMed Ismail Bennani   StructuredData::ObjectSP obj = Dispatch("get_queue", error);
9259d8dd79SMed Ismail Bennani 
9388a941baSMed Ismail Bennani   if (!CheckStructuredDataObject(LLVM_PRETTY_FUNCTION, obj, error))
9459d8dd79SMed Ismail Bennani     return {};
9559d8dd79SMed Ismail Bennani 
9659d8dd79SMed Ismail Bennani   return obj->GetStringValue().str();
9759d8dd79SMed Ismail Bennani }
9859d8dd79SMed Ismail Bennani 
9959d8dd79SMed Ismail Bennani StructuredData::DictionarySP ScriptedThreadPythonInterface::GetStopReason() {
10059d8dd79SMed Ismail Bennani   Status error;
10159d8dd79SMed Ismail Bennani   StructuredData::DictionarySP dict =
10259d8dd79SMed Ismail Bennani       Dispatch<StructuredData::DictionarySP>("get_stop_reason", error);
10359d8dd79SMed Ismail Bennani 
10488a941baSMed Ismail Bennani   if (!CheckStructuredDataObject(LLVM_PRETTY_FUNCTION, dict, error))
10559d8dd79SMed Ismail Bennani     return {};
10659d8dd79SMed Ismail Bennani 
10759d8dd79SMed Ismail Bennani   return dict;
10859d8dd79SMed Ismail Bennani }
10959d8dd79SMed Ismail Bennani 
11059d8dd79SMed Ismail Bennani StructuredData::ArraySP ScriptedThreadPythonInterface::GetStackFrames() {
11159d8dd79SMed Ismail Bennani   return nullptr;
11259d8dd79SMed Ismail Bennani }
11359d8dd79SMed Ismail Bennani 
11459d8dd79SMed Ismail Bennani StructuredData::DictionarySP ScriptedThreadPythonInterface::GetRegisterInfo() {
11559d8dd79SMed Ismail Bennani   Status error;
11659d8dd79SMed Ismail Bennani   StructuredData::DictionarySP dict =
11759d8dd79SMed Ismail Bennani       Dispatch<StructuredData::DictionarySP>("get_register_info", error);
11859d8dd79SMed Ismail Bennani 
11988a941baSMed Ismail Bennani   if (!CheckStructuredDataObject(LLVM_PRETTY_FUNCTION, dict, error))
12059d8dd79SMed Ismail Bennani     return {};
12159d8dd79SMed Ismail Bennani 
12259d8dd79SMed Ismail Bennani   return dict;
12359d8dd79SMed Ismail Bennani }
12459d8dd79SMed Ismail Bennani 
12559d8dd79SMed Ismail Bennani llvm::Optional<std::string>
12659d8dd79SMed Ismail Bennani ScriptedThreadPythonInterface::GetRegisterContext() {
12759d8dd79SMed Ismail Bennani   Status error;
12859d8dd79SMed Ismail Bennani   StructuredData::ObjectSP obj = Dispatch("get_register_context", error);
12959d8dd79SMed Ismail Bennani 
13088a941baSMed Ismail Bennani   if (!CheckStructuredDataObject(LLVM_PRETTY_FUNCTION, obj, error))
13159d8dd79SMed Ismail Bennani     return {};
13259d8dd79SMed Ismail Bennani 
13359d8dd79SMed Ismail Bennani   return obj->GetAsString()->GetValue().str();
13459d8dd79SMed Ismail Bennani }
13559d8dd79SMed Ismail Bennani 
13659d8dd79SMed Ismail Bennani #endif
137