[lldb] Introduce OperatingSystem{,Python}Interface and make use it
This patch aims to consolidate the OperatingSystem scripting affordance
by introducing a stable interface that conforms to the
Scripted{,Python}Interface.
This unify the way we call into python methods from lldb while
also improving its capabilities by allowing us to pass lldb_private
objects are arguments.
Differential Revision: https://reviews.llvm.org/D159314
Signed-off-by: Med Ismail Bennani <ismail@bennani.ma>
This commit is contained in:
@@ -14,6 +14,7 @@
|
||||
// LLDB Python header must be included first
|
||||
#include "lldb-python.h"
|
||||
|
||||
#include "Interfaces/OperatingSystemPythonInterface.h"
|
||||
#include "Interfaces/ScriptedPlatformPythonInterface.h"
|
||||
#include "Interfaces/ScriptedProcessPythonInterface.h"
|
||||
#include "Interfaces/ScriptedThreadPythonInterface.h"
|
||||
@@ -1521,6 +1522,11 @@ ScriptInterpreterPythonImpl::CreateScriptedThreadInterface() {
|
||||
return std::make_shared<ScriptedThreadPythonInterface>(*this);
|
||||
}
|
||||
|
||||
OperatingSystemInterfaceSP
|
||||
ScriptInterpreterPythonImpl::CreateOperatingSystemInterface() {
|
||||
return std::make_shared<OperatingSystemPythonInterface>(*this);
|
||||
}
|
||||
|
||||
StructuredData::ObjectSP
|
||||
ScriptInterpreterPythonImpl::CreateStructuredDataFromScriptObject(
|
||||
ScriptObject obj) {
|
||||
@@ -1532,159 +1538,6 @@ ScriptInterpreterPythonImpl::CreateStructuredDataFromScriptObject(
|
||||
return py_obj.CreateStructuredObject();
|
||||
}
|
||||
|
||||
StructuredData::GenericSP
|
||||
ScriptInterpreterPythonImpl::OSPlugin_CreatePluginObject(
|
||||
const char *class_name, lldb::ProcessSP process_sp) {
|
||||
if (class_name == nullptr || class_name[0] == '\0')
|
||||
return StructuredData::GenericSP();
|
||||
|
||||
if (!process_sp)
|
||||
return StructuredData::GenericSP();
|
||||
|
||||
Locker py_lock(this, Locker::AcquireLock | Locker::NoSTDIN, Locker::FreeLock);
|
||||
PythonObject ret_val = SWIGBridge::LLDBSWIGPythonCreateOSPlugin(
|
||||
class_name, m_dictionary_name.c_str(), process_sp);
|
||||
|
||||
return StructuredData::GenericSP(
|
||||
new StructuredPythonObject(std::move(ret_val)));
|
||||
}
|
||||
|
||||
StructuredData::DictionarySP ScriptInterpreterPythonImpl::OSPlugin_RegisterInfo(
|
||||
StructuredData::ObjectSP os_plugin_object_sp) {
|
||||
Locker py_lock(this, Locker::AcquireLock | Locker::NoSTDIN, Locker::FreeLock);
|
||||
|
||||
if (!os_plugin_object_sp)
|
||||
return {};
|
||||
|
||||
StructuredData::Generic *generic = os_plugin_object_sp->GetAsGeneric();
|
||||
if (!generic)
|
||||
return {};
|
||||
|
||||
PythonObject implementor(PyRefType::Borrowed,
|
||||
(PyObject *)generic->GetValue());
|
||||
|
||||
if (!implementor.IsAllocated())
|
||||
return {};
|
||||
|
||||
llvm::Expected<PythonObject> expected_py_return =
|
||||
implementor.CallMethod("get_register_info");
|
||||
|
||||
if (!expected_py_return) {
|
||||
llvm::consumeError(expected_py_return.takeError());
|
||||
return {};
|
||||
}
|
||||
|
||||
PythonObject py_return = std::move(expected_py_return.get());
|
||||
|
||||
if (py_return.get()) {
|
||||
PythonDictionary result_dict(PyRefType::Borrowed, py_return.get());
|
||||
return result_dict.CreateStructuredDictionary();
|
||||
}
|
||||
return StructuredData::DictionarySP();
|
||||
}
|
||||
|
||||
StructuredData::ArraySP ScriptInterpreterPythonImpl::OSPlugin_ThreadsInfo(
|
||||
StructuredData::ObjectSP os_plugin_object_sp) {
|
||||
Locker py_lock(this, Locker::AcquireLock | Locker::NoSTDIN, Locker::FreeLock);
|
||||
if (!os_plugin_object_sp)
|
||||
return {};
|
||||
|
||||
StructuredData::Generic *generic = os_plugin_object_sp->GetAsGeneric();
|
||||
if (!generic)
|
||||
return {};
|
||||
|
||||
PythonObject implementor(PyRefType::Borrowed,
|
||||
(PyObject *)generic->GetValue());
|
||||
|
||||
if (!implementor.IsAllocated())
|
||||
return {};
|
||||
|
||||
llvm::Expected<PythonObject> expected_py_return =
|
||||
implementor.CallMethod("get_thread_info");
|
||||
|
||||
if (!expected_py_return) {
|
||||
llvm::consumeError(expected_py_return.takeError());
|
||||
return {};
|
||||
}
|
||||
|
||||
PythonObject py_return = std::move(expected_py_return.get());
|
||||
|
||||
if (py_return.get()) {
|
||||
PythonList result_list(PyRefType::Borrowed, py_return.get());
|
||||
return result_list.CreateStructuredArray();
|
||||
}
|
||||
return StructuredData::ArraySP();
|
||||
}
|
||||
|
||||
StructuredData::StringSP
|
||||
ScriptInterpreterPythonImpl::OSPlugin_RegisterContextData(
|
||||
StructuredData::ObjectSP os_plugin_object_sp, lldb::tid_t tid) {
|
||||
Locker py_lock(this, Locker::AcquireLock | Locker::NoSTDIN, Locker::FreeLock);
|
||||
|
||||
if (!os_plugin_object_sp)
|
||||
return {};
|
||||
|
||||
StructuredData::Generic *generic = os_plugin_object_sp->GetAsGeneric();
|
||||
if (!generic)
|
||||
return {};
|
||||
PythonObject implementor(PyRefType::Borrowed,
|
||||
(PyObject *)generic->GetValue());
|
||||
|
||||
if (!implementor.IsAllocated())
|
||||
return {};
|
||||
|
||||
llvm::Expected<PythonObject> expected_py_return =
|
||||
implementor.CallMethod("get_register_data", tid);
|
||||
|
||||
if (!expected_py_return) {
|
||||
llvm::consumeError(expected_py_return.takeError());
|
||||
return {};
|
||||
}
|
||||
|
||||
PythonObject py_return = std::move(expected_py_return.get());
|
||||
|
||||
if (py_return.get()) {
|
||||
PythonBytes result(PyRefType::Borrowed, py_return.get());
|
||||
return result.CreateStructuredString();
|
||||
}
|
||||
return {};
|
||||
}
|
||||
|
||||
StructuredData::DictionarySP ScriptInterpreterPythonImpl::OSPlugin_CreateThread(
|
||||
StructuredData::ObjectSP os_plugin_object_sp, lldb::tid_t tid,
|
||||
lldb::addr_t context) {
|
||||
Locker py_lock(this, Locker::AcquireLock | Locker::NoSTDIN, Locker::FreeLock);
|
||||
|
||||
if (!os_plugin_object_sp)
|
||||
return {};
|
||||
|
||||
StructuredData::Generic *generic = os_plugin_object_sp->GetAsGeneric();
|
||||
if (!generic)
|
||||
return {};
|
||||
|
||||
PythonObject implementor(PyRefType::Borrowed,
|
||||
(PyObject *)generic->GetValue());
|
||||
|
||||
if (!implementor.IsAllocated())
|
||||
return {};
|
||||
|
||||
llvm::Expected<PythonObject> expected_py_return =
|
||||
implementor.CallMethod("create_thread", tid, context);
|
||||
|
||||
if (!expected_py_return) {
|
||||
llvm::consumeError(expected_py_return.takeError());
|
||||
return {};
|
||||
}
|
||||
|
||||
PythonObject py_return = std::move(expected_py_return.get());
|
||||
|
||||
if (py_return.get()) {
|
||||
PythonDictionary result_dict(PyRefType::Borrowed, py_return.get());
|
||||
return result_dict.CreateStructuredDictionary();
|
||||
}
|
||||
return StructuredData::DictionarySP();
|
||||
}
|
||||
|
||||
StructuredData::ObjectSP ScriptInterpreterPythonImpl::CreateScriptedThreadPlan(
|
||||
const char *class_name, const StructuredDataImpl &args_data,
|
||||
std::string &error_str, lldb::ThreadPlanSP thread_plan_sp) {
|
||||
|
||||
Reference in New Issue
Block a user