summaryrefslogtreecommitdiffstats
path: root/lldb/scripts/Python/python-wrapper.swig
diff options
context:
space:
mode:
authorEnrico Granata <egranata@apple.com>2015-03-13 02:20:41 +0000
committerEnrico Granata <egranata@apple.com>2015-03-13 02:20:41 +0000
commit9fe00e52d3dc12e80428648d84542f800c362163 (patch)
tree397f77d6aa9a2d566e2f8d6f4ce8a47d858ecece /lldb/scripts/Python/python-wrapper.swig
parent9f611e3a89c3a87d2748061d149c30e3b132f3a8 (diff)
downloadbcm5719-llvm-9fe00e52d3dc12e80428648d84542f800c362163.tar.gz
bcm5719-llvm-9fe00e52d3dc12e80428648d84542f800c362163.zip
Bulk of the infrastructure work to allow script commands to be backed by object instances in addition to free functions
This works by creating a command backed by a class whose interface should - at least - include def __init__(self, debugger, session_dict) def __call__(self, args, return_obj, exe_ctx) What works: - adding a command via command script add --class - calling a thusly created command What is missing: - support for custom help - test cases The missing parts will follow over the next couple of days This is an improvement over the existing system as: a) it provides an obvious location for commands to provide help strings (i.e. methods) b) it allows commands to store state in an obvious fashion c) it allows us to easily add features to script commands over time (option parsing and subcommands registration, I am looking at you :-) llvm-svn: 232136
Diffstat (limited to 'lldb/scripts/Python/python-wrapper.swig')
-rw-r--r--lldb/scripts/Python/python-wrapper.swig78
1 files changed, 78 insertions, 0 deletions
diff --git a/lldb/scripts/Python/python-wrapper.swig b/lldb/scripts/Python/python-wrapper.swig
index 84375fd1547..57291bc15a8 100644
--- a/lldb/scripts/Python/python-wrapper.swig
+++ b/lldb/scripts/Python/python-wrapper.swig
@@ -453,6 +453,44 @@ LLDBSwigPythonCreateSyntheticProvider
}
SWIGEXPORT void*
+LLDBSwigPythonCreateCommandObject
+(
+ const char *python_class_name,
+ const char *session_dictionary_name,
+ const lldb::DebuggerSP debugger_sp
+)
+{
+ PyObject* retval = NULL;
+
+ if (python_class_name == NULL || python_class_name[0] == '\0' || !session_dictionary_name)
+ Py_RETURN_NONE;
+
+ lldb::SBDebugger debugger_sb(debugger_sp);
+
+ {
+ PyErr_Cleaner py_err_cleaner(true);
+
+ PyCallable pfunc = PyCallable::FindWithFunctionName(python_class_name,session_dictionary_name);
+
+ if (!pfunc)
+ return retval;
+
+ PyObject* session_dict = NULL;
+ session_dict = FindSessionDictionary(session_dictionary_name);
+ retval = pfunc(debugger_sb, session_dict);
+
+ Py_XINCREF (session_dict);
+
+ Py_XINCREF(retval);
+ }
+
+ if (retval)
+ return retval;
+ else
+ Py_RETURN_NONE;
+}
+
+SWIGEXPORT void*
LLDBSwigPythonCreateScriptedThreadPlan
(
const char *python_class_name,
@@ -845,6 +883,46 @@ LLDBSwigPythonCallCommand
return retval;
}
+SWIGEXPORT bool
+LLDBSwigPythonCallCommandObject
+(
+ PyObject *implementor,
+ lldb::DebuggerSP& debugger,
+ const char* args,
+ lldb_private::CommandReturnObject& cmd_retobj,
+ lldb::ExecutionContextRefSP exe_ctx_ref_sp
+)
+{
+
+ lldb::SBCommandReturnObject cmd_retobj_sb(&cmd_retobj);
+ SBCommandReturnObjectReleaser cmd_retobj_sb_releaser(cmd_retobj_sb);
+ lldb::SBDebugger debugger_sb(debugger);
+ lldb::SBExecutionContext exe_ctx_sb(exe_ctx_ref_sp);
+
+ bool retval = false;
+
+ {
+ PyErr_Cleaner py_err_cleaner(true);
+
+ PyCallable pfunc = PyCallable::FindWithMemberFunction(implementor,"__call__");
+
+ if (!pfunc)
+ return NULL;
+
+ // pass the pointer-to cmd_retobj_sb or watch the underlying object disappear from under you
+ // see comment above for SBCommandReturnObjectReleaser for further details
+ PyObject* pvalue = NULL;
+
+ pvalue = pfunc(debugger_sb, args, exe_ctx_sb, &cmd_retobj_sb);
+
+ Py_XDECREF (pvalue);
+
+ retval = true;
+ }
+
+ return retval;
+}
+
SWIGEXPORT void*
LLDBSWIGPythonCreateOSPlugin
(
OpenPOWER on IntegriCloud