summaryrefslogtreecommitdiffstats
path: root/lldb/source
diff options
context:
space:
mode:
Diffstat (limited to 'lldb/source')
-rw-r--r--lldb/source/Interpreter/ScriptInterpreterPython.cpp88
-rw-r--r--lldb/source/Plugins/OperatingSystem/Python/OperatingSystemPython.cpp41
-rw-r--r--lldb/source/Plugins/OperatingSystem/Python/OperatingSystemPython.h3
3 files changed, 121 insertions, 11 deletions
diff --git a/lldb/source/Interpreter/ScriptInterpreterPython.cpp b/lldb/source/Interpreter/ScriptInterpreterPython.cpp
index 79089c56648..94b27bb8297 100644
--- a/lldb/source/Interpreter/ScriptInterpreterPython.cpp
+++ b/lldb/source/Interpreter/ScriptInterpreterPython.cpp
@@ -55,6 +55,7 @@ static ScriptInterpreter::SWIGPythonCastPyObjectToSBValue g_swig_cast_to_sbvalue
static ScriptInterpreter::SWIGPythonUpdateSynthProviderInstance g_swig_update_provider = NULL;
static ScriptInterpreter::SWIGPythonCallCommand g_swig_call_command = NULL;
static ScriptInterpreter::SWIGPythonCallModuleInit g_swig_call_module_init = NULL;
+static ScriptInterpreter::SWIGPythonCreateOSPlugin g_swig_create_os_plugin = NULL;
// these are the Pythonic implementations of the required callbacks
// these are scripting-language specific, which is why they belong here
@@ -121,6 +122,13 @@ extern "C" bool LLDBSwigPythonCallModuleInit
lldb::DebuggerSP& debugger
);
+extern "C" void* LLDBSWIGPythonCreateOSPlugin
+(
+ const std::string python_class_name,
+ const char *session_dictionary_name,
+ const lldb::ProcessSP& process_sp
+);
+
static int
_check_and_flush (FILE *stream)
{
@@ -1697,6 +1705,85 @@ ScriptInterpreterPython::GenerateTypeSynthClass (StringList &user_input, std::st
}
lldb::ScriptInterpreterObjectSP
+ScriptInterpreterPython::CreateOSPlugin (std::string class_name,
+ lldb::ProcessSP process_sp)
+{
+ if (class_name.empty())
+ return lldb::ScriptInterpreterObjectSP();
+
+ if (!process_sp)
+ return lldb::ScriptInterpreterObjectSP();
+
+ void* ret_val;
+
+ {
+ Locker py_lock(this);
+ ret_val = g_swig_create_os_plugin (class_name,
+ m_dictionary_name.c_str(),
+ process_sp);
+ }
+
+ return MakeScriptObject(ret_val);
+}
+
+lldb::ScriptInterpreterObjectSP
+ScriptInterpreterPython::OSPlugin_QueryForRegisterInfo (lldb::ScriptInterpreterObjectSP object)
+{
+ static char callee_name[] = "get_register_info";
+
+ if (!object)
+ return lldb::ScriptInterpreterObjectSP();
+
+ PyObject* implementor = (PyObject*)object->GetObject();
+
+ if (implementor == NULL || implementor == Py_None)
+ return lldb::ScriptInterpreterObjectSP();
+
+ PyObject* pmeth = PyObject_GetAttrString(implementor, callee_name);
+
+ if (PyErr_Occurred())
+ {
+ PyErr_Clear();
+ }
+
+ if (pmeth == NULL || pmeth == Py_None)
+ {
+ Py_XDECREF(pmeth);
+ return lldb::ScriptInterpreterObjectSP();
+ }
+
+ if (PyCallable_Check(pmeth) == 0)
+ {
+ if (PyErr_Occurred())
+ {
+ PyErr_Clear();
+ }
+
+ Py_XDECREF(pmeth);
+ return lldb::ScriptInterpreterObjectSP();
+ }
+
+ if (PyErr_Occurred())
+ {
+ PyErr_Clear();
+ }
+
+ Py_XDECREF(pmeth);
+
+ // right now we know this function exists and is callable..
+ PyObject* py_return = PyObject_CallMethod(implementor, callee_name, NULL);
+
+ // if it fails, print the error but otherwise go on
+ if (PyErr_Occurred())
+ {
+ PyErr_Print();
+ PyErr_Clear();
+ }
+
+ return MakeScriptObject(py_return);
+}
+
+lldb::ScriptInterpreterObjectSP
ScriptInterpreterPython::CreateSyntheticScriptedProvider (std::string class_name,
lldb::ValueObjectSP valobj)
{
@@ -2366,6 +2453,7 @@ ScriptInterpreterPython::InitializeInterpreter (SWIGInitCallback python_swig_ini
g_swig_update_provider = LLDBSwigPython_UpdateSynthProviderInstance;
g_swig_call_command = LLDBSwigPythonCallCommand;
g_swig_call_module_init = LLDBSwigPythonCallModuleInit;
+ g_swig_create_os_plugin = LLDBSWIGPythonCreateOSPlugin;
}
void
diff --git a/lldb/source/Plugins/OperatingSystem/Python/OperatingSystemPython.cpp b/lldb/source/Plugins/OperatingSystem/Python/OperatingSystemPython.cpp
index 761da1fa884..ad86f8c7624 100644
--- a/lldb/source/Plugins/OperatingSystem/Python/OperatingSystemPython.cpp
+++ b/lldb/source/Plugins/OperatingSystem/Python/OperatingSystemPython.cpp
@@ -16,10 +16,13 @@
#include "lldb/Core/ArchSpec.h"
#include "lldb/Core/DataBufferHeap.h"
+#include "lldb/Core/Debugger.h"
#include "lldb/Core/Module.h"
#include "lldb/Core/PluginManager.h"
#include "lldb/Core/RegisterValue.h"
#include "lldb/Core/ValueObjectVariable.h"
+#include "lldb/Interpreter/CommandInterpreter.h"
+#include "lldb/Interpreter/PythonDataObjects.h"
#include "lldb/Symbol/ClangNamespaceDecl.h"
#include "lldb/Symbol/ObjectFile.h"
#include "lldb/Symbol/VariableList.h"
@@ -53,7 +56,7 @@ OperatingSystem *
OperatingSystemPython::CreateInstance (Process *process, bool force)
{
// Python OperatingSystem plug-ins must be requested by name, so force must be true
- if (force)
+ //if (force)
return new OperatingSystemPython (process);
return NULL;
}
@@ -75,14 +78,23 @@ OperatingSystemPython::GetPluginDescriptionStatic()
OperatingSystemPython::OperatingSystemPython (lldb_private::Process *process) :
OperatingSystem (process),
m_thread_list_valobj_sp (),
- m_register_info_ap ()
+ m_register_info_ap (),
+ m_interpreter(NULL),
+ m_python_object(NULL)
{
- // TODO: python: create a new python class the implements the necessary
- // python class that will cache a SBProcess that contains the "process"
- // argument above and implements:
- // dict get_thread_info()
- // dict get_register_info()
- // Bytes get_register_context_data(SBThread thread)
+ if (!process)
+ return;
+ lldb::TargetSP target_sp = process->CalculateTarget();
+ if (!target_sp)
+ return;
+ m_interpreter = target_sp->GetDebugger().GetCommandInterpreter().GetScriptInterpreter();
+ if (m_interpreter)
+ {
+ // TODO: hardcoded is not good
+ auto object_sp = m_interpreter->CreateOSPlugin("operating_system.PlugIn",process->CalculateProcess());
+ if (object_sp)
+ m_python_object = object_sp->GetObject();
+ }
}
OperatingSystemPython::~OperatingSystemPython ()
@@ -92,10 +104,17 @@ OperatingSystemPython::~OperatingSystemPython ()
DynamicRegisterInfo *
OperatingSystemPython::GetDynamicRegisterInfo ()
{
- // TODO: python: call get_register_info() on the python object that
- // represents our instance of the OperatingSystem plug-in
+ if (!m_interpreter || !m_python_object)
+ return NULL;
+ auto object_sp = m_interpreter->OSPlugin_QueryForRegisterInfo(m_interpreter->MakeScriptObject(m_python_object));
+ if (!object_sp)
+ return NULL;
+ PythonDataObject dictionary_data_obj((PyObject*)object_sp->GetObject());
+ PythonDataDictionary dictionary = dictionary_data_obj.GetDictionaryObject();
+ if(!dictionary)
+ return NULL;
- // Example code below shows creating a new DynamicRegisterInfo()
+ // TODO: iterate over the dictionary
if (m_register_info_ap.get() == NULL && m_thread_list_valobj_sp)
{
// static ConstString g_gpr_member_name("gpr");
diff --git a/lldb/source/Plugins/OperatingSystem/Python/OperatingSystemPython.h b/lldb/source/Plugins/OperatingSystem/Python/OperatingSystemPython.h
index 850ec648bff..5711426ca8f 100644
--- a/lldb/source/Plugins/OperatingSystem/Python/OperatingSystemPython.h
+++ b/lldb/source/Plugins/OperatingSystem/Python/OperatingSystemPython.h
@@ -14,6 +14,7 @@
// C Includes
// C++ Includes
// Other libraries and framework includes
+#include "lldb/Interpreter/ScriptInterpreter.h"
#include "lldb/Target/OperatingSystem.h"
class DynamicRegisterInfo;
@@ -82,6 +83,8 @@ protected:
lldb::ValueObjectSP m_thread_list_valobj_sp;
std::auto_ptr<DynamicRegisterInfo> m_register_info_ap;
+ lldb_private::ScriptInterpreter *m_interpreter;
+ void* m_python_object;
};
OpenPOWER on IntegriCloud