diff options
Diffstat (limited to 'lldb')
-rw-r--r-- | lldb/include/lldb/API/SBDebugger.h | 2 | ||||
-rw-r--r-- | lldb/include/lldb/Interpreter/ScriptInterpreter.h | 2 | ||||
-rw-r--r-- | lldb/scripts/Python/python-wrapper.swig | 39 | ||||
-rw-r--r-- | lldb/source/API/SBCommandInterpreter.cpp | 2 | ||||
-rw-r--r-- | lldb/source/API/SBDebugger.cpp | 5 | ||||
-rw-r--r-- | lldb/source/Interpreter/ScriptInterpreterPython.cpp | 9 |
6 files changed, 40 insertions, 19 deletions
diff --git a/lldb/include/lldb/API/SBDebugger.h b/lldb/include/lldb/API/SBDebugger.h index 2f130ac5622..07d2be01bfa 100644 --- a/lldb/include/lldb/API/SBDebugger.h +++ b/lldb/include/lldb/API/SBDebugger.h @@ -40,6 +40,8 @@ public: SBDebugger(const lldb::SBDebugger &rhs); #ifndef SWIG + SBDebugger(const lldb::DebuggerSP &debugger_sp); + lldb::SBDebugger & operator = (const lldb::SBDebugger &rhs); #endif diff --git a/lldb/include/lldb/Interpreter/ScriptInterpreter.h b/lldb/include/lldb/Interpreter/ScriptInterpreter.h index 3056f197110..21becb6f297 100644 --- a/lldb/include/lldb/Interpreter/ScriptInterpreter.h +++ b/lldb/include/lldb/Interpreter/ScriptInterpreter.h @@ -49,7 +49,7 @@ public: lldb::DebuggerSP& debugger, const char* args, std::string& err_msg, - void* cmd_retobj); + lldb_private::CommandReturnObject& cmd_retobj); typedef enum { diff --git a/lldb/scripts/Python/python-wrapper.swig b/lldb/scripts/Python/python-wrapper.swig index e74c432b098..109b45f0b88 100644 --- a/lldb/scripts/Python/python-wrapper.swig +++ b/lldb/scripts/Python/python-wrapper.swig @@ -136,7 +136,7 @@ LLDBSwigPythonCallTypeScript std::string retval = ""; - PyObject *ValObj_PyObj = SWIG_NewPointerObj((void *) &valobj_sp, SWIGTYPE_p_lldb__SBValue, 0); + PyObject *ValObj_PyObj = SWIG_NewPointerObj((void *) &sb_value, SWIGTYPE_p_lldb__SBValue, 0); if (ValObj_PyObj == NULL) return retval; @@ -263,9 +263,11 @@ LLDBSwigPythonCreateSyntheticProvider if (python_class_name.empty() || !session_dictionary_name) Py_RETURN_NONE; - lldb::ValueObjectSP* valobj_sp_ptr = new lldb::ValueObjectSP(valobj_sp); + // I do not want the SBValue to be deallocated when going out of scope because python + // has ownership of it and will manage memory for this object by itself + lldb::SBValue *valobj_sb = new lldb::SBValue(valobj_sp); - PyObject *ValObj_PyObj = SWIG_NewPointerObj((void *) valobj_sp_ptr, SWIGTYPE_p_lldb__SBValue, SWIG_POINTER_OWN); + PyObject *ValObj_PyObj = SWIG_NewPointerObj((void *)valobj_sb, SWIGTYPE_p_lldb__SBValue, SWIG_POINTER_OWN); if (ValObj_PyObj == NULL) Py_RETURN_NONE; @@ -582,6 +584,14 @@ LLDBSWIGPython_CastPyObjectToSBValue return sb_ptr; } +// we use this macro to bail out of LLDBSwigPythonCallCommand in order +// to make sure that the that the SBCommandReturnObject will not destroy +// the contained CommandReturnObject when going out of scope +#define RETURN_RETVAL { \ + cmd_retobj_sb.Release(); \ + return retval; \ +} + SWIGEXPORT bool LLDBSwigPythonCallCommand ( @@ -590,25 +600,26 @@ LLDBSwigPythonCallCommand lldb::DebuggerSP& debugger, const char* args, std::string& err_msg, - void* cmd_retobj + lldb_private::CommandReturnObject& cmd_retobj ) { - not_owning_ap<lldb_private::CommandReturnObject> auto_cmd_retobj((lldb_private::CommandReturnObject*)cmd_retobj); + lldb::SBCommandReturnObject cmd_retobj_sb(&cmd_retobj); + lldb::SBDebugger debugger_sb(debugger); bool retval = false; - PyObject *DebuggerObj_PyObj = SWIG_NewPointerObj((void *) &debugger, SWIGTYPE_p_lldb__SBDebugger, 0); - PyObject *CmdRetObj_PyObj = SWIG_NewPointerObj((void *) &auto_cmd_retobj, SWIGTYPE_p_lldb__SBCommandReturnObject, 0); + PyObject *DebuggerObj_PyObj = SWIG_NewPointerObj((void *) &debugger_sb, SWIGTYPE_p_lldb__SBDebugger, 0); + PyObject *CmdRetObj_PyObj = SWIG_NewPointerObj((void *) &cmd_retobj_sb, SWIGTYPE_p_lldb__SBCommandReturnObject, 0); if (DebuggerObj_PyObj == NULL) - return retval; + RETURN_RETVAL; if (CmdRetObj_PyObj == NULL) - return retval; + RETURN_RETVAL; if (!python_function_name || !session_dictionary_name) - return retval; + RETURN_RETVAL; PyObject *pmodule, *main_dict, *session_dict, *pfunc; PyObject *pargs, *pvalue; @@ -642,7 +653,7 @@ LLDBSwigPythonCallCommand } if (!session_dict || !PyDict_Check (session_dict)) - return retval; + RETURN_RETVAL; // Find the function we need to call in the current session's dictionary. @@ -673,7 +684,7 @@ LLDBSwigPythonCallCommand { if (PyErr_Occurred()) PyErr_Clear(); - return retval; + RETURN_RETVAL; } PyTuple_SetItem (pargs, 0, DebuggerObj_PyObj); // This "steals" a reference to DebuggerObj_PyObj @@ -721,7 +732,9 @@ LLDBSwigPythonCallCommand PyErr_Print(); PyErr_Clear (); } - return retval; + RETURN_RETVAL; } +#undef RETURN_RETVAL + %} diff --git a/lldb/source/API/SBCommandInterpreter.cpp b/lldb/source/API/SBCommandInterpreter.cpp index b56ccb4ec17..5b3371b62bc 100644 --- a/lldb/source/API/SBCommandInterpreter.cpp +++ b/lldb/source/API/SBCommandInterpreter.cpp @@ -344,7 +344,7 @@ extern "C" bool LLDBSwigPythonCallCommand lldb::DebuggerSP& debugger, const char* args, std::string& err_msg, - void* cmd_retobj + lldb_private::CommandReturnObject& cmd_retobj ); diff --git a/lldb/source/API/SBDebugger.cpp b/lldb/source/API/SBDebugger.cpp index 3fa44bb27ae..70ca8b286db 100644 --- a/lldb/source/API/SBDebugger.cpp +++ b/lldb/source/API/SBDebugger.cpp @@ -128,6 +128,11 @@ SBDebugger::SBDebugger () : { } +SBDebugger::SBDebugger(const lldb::DebuggerSP &debugger_sp) : + m_opaque_sp(debugger_sp) +{ +} + SBDebugger::SBDebugger(const SBDebugger &rhs) : m_opaque_sp (rhs.m_opaque_sp) { diff --git a/lldb/source/Interpreter/ScriptInterpreterPython.cpp b/lldb/source/Interpreter/ScriptInterpreterPython.cpp index 64efa528dd0..588e2c15651 100644 --- a/lldb/source/Interpreter/ScriptInterpreterPython.cpp +++ b/lldb/source/Interpreter/ScriptInterpreterPython.cpp @@ -20,6 +20,7 @@ #include "lldb/API/SBFrame.h" #include "lldb/API/SBBreakpointLocation.h" +#include "lldb/API/SBCommandReturnObject.h" #include "lldb/Breakpoint/StoppointCallbackContext.h" #include "lldb/Core/Debugger.h" #include "lldb/Core/Timer.h" @@ -1930,7 +1931,7 @@ ScriptInterpreterPython::RunScriptBasedCommand(const char* impl_function, } ScriptInterpreterPython *python_interpreter = this; - + lldb::DebuggerSP debugger_sp = m_interpreter.GetDebugger().GetSP(); bool ret_val; @@ -1946,7 +1947,7 @@ ScriptInterpreterPython::RunScriptBasedCommand(const char* impl_function, debugger_sp, args, err_msg, - (void*)&cmd_retobj); + cmd_retobj); python_interpreter->LeaveSession (); } else @@ -1960,7 +1961,7 @@ ScriptInterpreterPython::RunScriptBasedCommand(const char* impl_function, debugger_sp, args, err_msg, - (void*)&cmd_retobj); + cmd_retobj); python_interpreter->LeaveSession (); ReleasePythonLock (); } @@ -1969,7 +1970,7 @@ ScriptInterpreterPython::RunScriptBasedCommand(const char* impl_function, error.SetErrorString(err_msg.c_str()); else error.Clear(); - + return ret_val; |