[Lldb-commits] [lldb] r184608 - Lots of cleanup on the SWIG wrapping layer
Malea, Daniel
daniel.malea at intel.com
Tue Jul 2 10:58:22 PDT 2013
Hi Enrico,
This commit seems to be causing some (compile) problems on one of the
buildbots (TODO) due to:
On 2013-06-21 7:27 PM, "Enrico Granata" <egranata at apple.com> wrote:
>Author: enrico
>Date: Fri Jun 21 18:27:16 2013
>New Revision: 184608
>
>URL: http://llvm.org/viewvc/llvm-project?rev=184608&view=rev
>Log:
>Lots of cleanup on the SWIG wrapping layer
>
>Now, the way SWIG wrappers call into Python is through a utility
>PyCallable object, which overloads operator () to look like a normal
>function call
>Plus, using the SBTypeToSWIGWrapper() family of functions, we can call
>python functions transparently as if they were plain C functions
>Using this new technique should make adding new Python call points easier
>and quicker
>
>The PyCallable is a generally useful facility, and we might want to
>consider moving it to a separate layer where other parts of LLDB can use
>it
>
>
>Modified:
> lldb/trunk/lldb.xcodeproj/project.pbxproj
> lldb/trunk/scripts/Python/python-swigsafecast.swig
> lldb/trunk/scripts/Python/python-wrapper.swig
> lldb/trunk/test/help/TestHelp.py
>
>Modified: lldb/trunk/lldb.xcodeproj/project.pbxproj
>URL:
>http://llvm.org/viewvc/llvm-project/lldb/trunk/lldb.xcodeproj/project.pbxp
>roj?rev=184608&r1=184607&r2=184608&view=diff
>==========================================================================
>====
>--- lldb/trunk/lldb.xcodeproj/project.pbxproj (original)
>+++ lldb/trunk/lldb.xcodeproj/project.pbxproj Fri Jun 21 18:27:16 2013
>@@ -1543,7 +1543,7 @@
> 69A01E1E1236C5D400C660B5 /* Mutex.cpp */ = {isa = PBXFileReference;
>fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path =
>Mutex.cpp; sourceTree = "<group>"; };
> 69A01E1F1236C5D400C660B5 /* Symbols.cpp */ = {isa = PBXFileReference;
>fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path =
>Symbols.cpp; sourceTree = "<group>"; };
> 69A01E201236C5D400C660B5 /* TimeValue.cpp */ = {isa =
>PBXFileReference; fileEncoding = 4; lastKnownFileType =
>sourcecode.cpp.cpp; path = TimeValue.cpp; sourceTree = "<group>"; };
>- 94005E0313F438DF001EF42D /* python-wrapper.swig */ = {isa =
>PBXFileReference; lastKnownFileType = text; path = "python-wrapper.swig";
>sourceTree = "<group>"; };
>+ 94005E0313F438DF001EF42D /* python-wrapper.swig */ = {isa =
>PBXFileReference; explicitFileType = sourcecode.cpp.cpp; path =
>"python-wrapper.swig"; sourceTree = "<group>"; };
> 94005E0513F45A1B001EF42D /* embedded_interpreter.py */ = {isa =
>PBXFileReference; lastKnownFileType = text.script.python; name =
>embedded_interpreter.py; path =
>source/Interpreter/embedded_interpreter.py; sourceTree = "<group>"; };
> 94031A9B13CF484600DCFF3C /* InputReaderEZ.h */ = {isa =
>PBXFileReference; lastKnownFileType = sourcecode.c.h; name =
>InputReaderEZ.h; path = include/lldb/Core/InputReaderEZ.h; sourceTree =
>"<group>"; };
> 94031A9D13CF486600DCFF3C /* InputReaderEZ.cpp */ = {isa =
>PBXFileReference; fileEncoding = 4; lastKnownFileType =
>sourcecode.cpp.cpp; name = InputReaderEZ.cpp; path =
>source/Core/InputReaderEZ.cpp; sourceTree = "<group>"; };
>@@ -1555,7 +1555,7 @@
> 944372DB171F6B4300E57C32 /* RegisterContextDummy.h */ = {isa =
>PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h;
>name = RegisterContextDummy.h; path = Utility/RegisterContextDummy.h;
>sourceTree = "<group>"; };
> 9443B120140C18A90013457C /* SBData.h */ = {isa = PBXFileReference;
>lastKnownFileType = sourcecode.c.h; name = SBData.h; path =
>include/lldb/API/SBData.h; sourceTree = "<group>"; };
> 9443B121140C18C10013457C /* SBData.cpp */ = {isa = PBXFileReference;
>fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name =
>SBData.cpp; path = source/API/SBData.cpp; sourceTree = "<group>"; };
>- 944DC3481774C99000D7D884 /* python-swigsafecast.swig */ = {isa =
>PBXFileReference; lastKnownFileType = text; path =
>"python-swigsafecast.swig"; sourceTree = "<group>"; };
>+ 944DC3481774C99000D7D884 /* python-swigsafecast.swig */ = {isa =
>PBXFileReference; explicitFileType = sourcecode.cpp.cpp; path =
>"python-swigsafecast.swig"; sourceTree = "<group>"; };
> 9452573616262CD000325455 /* SBDeclaration.i */ = {isa =
>PBXFileReference; lastKnownFileType = sourcecode.c.c.preprocessed; path =
>SBDeclaration.i; sourceTree = "<group>"; };
> 9452573816262CEF00325455 /* SBDeclaration.h */ = {isa =
>PBXFileReference; lastKnownFileType = sourcecode.c.h; name =
>SBDeclaration.h; path = include/lldb/API/SBDeclaration.h; sourceTree =
>"<group>"; };
> 9452573916262D0200325455 /* SBDeclaration.cpp */ = {isa =
>PBXFileReference; fileEncoding = 4; lastKnownFileType =
>sourcecode.cpp.cpp; name = SBDeclaration.cpp; path =
>source/API/SBDeclaration.cpp; sourceTree = "<group>"; };
>@@ -1626,7 +1626,7 @@
> 94D6A0A816CEB55F00833B6E /* NSDictionary.cpp */ = {isa =
>PBXFileReference; fileEncoding = 4; lastKnownFileType =
>sourcecode.cpp.cpp; name = NSDictionary.cpp; path =
>source/DataFormatters/NSDictionary.cpp; sourceTree = "<group>"; };
> 94D6A0A916CEB55F00833B6E /* NSSet.cpp */ = {isa = PBXFileReference;
>fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name =
>NSSet.cpp; path = source/DataFormatters/NSSet.cpp; sourceTree =
>"<group>"; };
> 94E367CC140C4EC4001C7A5A /* modify-python-lldb.py */ = {isa =
>PBXFileReference; lastKnownFileType = text.script.python; path =
>"modify-python-lldb.py"; sourceTree = "<group>"; };
>- 94E367CE140C4EEA001C7A5A /* python-typemaps.swig */ = {isa =
>PBXFileReference; lastKnownFileType = text; path =
>"python-typemaps.swig"; sourceTree = "<group>"; };
>+ 94E367CE140C4EEA001C7A5A /* python-typemaps.swig */ = {isa =
>PBXFileReference; explicitFileType = sourcecode.cpp.cpp; path =
>"python-typemaps.swig"; sourceTree = "<group>"; };
> 94EA1D5A15E6C99B00D4171A /* PythonDataObjects.h */ = {isa =
>PBXFileReference; lastKnownFileType = sourcecode.c.h; name =
>PythonDataObjects.h; path = include/lldb/Interpreter/PythonDataObjects.h;
>sourceTree = "<group>"; };
> 94EA1D5B15E6C9B400D4171A /* PythonDataObjects.cpp */ = {isa =
>PBXFileReference; fileEncoding = 4; lastKnownFileType =
>sourcecode.cpp.cpp; name = PythonDataObjects.cpp; path =
>source/Interpreter/PythonDataObjects.cpp; sourceTree = "<group>"; };
> 94EBAC8313D9EE26009BA64E /* PythonPointer.h */ = {isa =
>PBXFileReference; lastKnownFileType = sourcecode.c.h; name =
>PythonPointer.h; path = include/lldb/Utility/PythonPointer.h; sourceTree
>= "<group>"; };
>@@ -1656,7 +1656,7 @@
> 9A42976211861AA600FE05CD /* CommandObjectBreakpointCommand.cpp */ =
>{isa = PBXFileReference; fileEncoding = 4; lastKnownFileType =
>sourcecode.cpp.cpp; name = CommandObjectBreakpointCommand.cpp; path =
>source/Commands/CommandObjectBreakpointCommand.cpp; sourceTree =
>"<group>"; };
> 9A4633DA11F65D8600955CE1 /* UserSettingsController.h */ = {isa =
>PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h;
>name = UserSettingsController.h; path =
>include/lldb/Core/UserSettingsController.h; sourceTree = "<group>"; };
> 9A4633DC11F65D9A00955CE1 /* UserSettingsController.cpp */ = {isa =
>PBXFileReference; fileEncoding = 4; lastKnownFileType =
>sourcecode.cpp.cpp; name = UserSettingsController.cpp; path =
>source/Core/UserSettingsController.cpp; sourceTree = "<group>"; };
>- 9A48A3A7124AAA5A00922451 /* python-extensions.swig */ = {isa =
>PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path =
>"python-extensions.swig"; sourceTree = "<group>"; };
>+ 9A48A3A7124AAA5A00922451 /* python-extensions.swig */ = {isa =
>PBXFileReference; explicitFileType = sourcecode.cpp.cpp; fileEncoding =
>4; path = "python-extensions.swig"; sourceTree = "<group>"; };
> 9A4F350F1368A51A00823F52 /* StreamAsynchronousIO.cpp */ = {isa =
>PBXFileReference; fileEncoding = 4; lastKnownFileType =
>sourcecode.cpp.cpp; name = StreamAsynchronousIO.cpp; path =
>source/Core/StreamAsynchronousIO.cpp; sourceTree = "<group>"; };
> 9A4F35111368A54100823F52 /* StreamAsynchronousIO.h */ = {isa =
>PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h;
>name = StreamAsynchronousIO.h; path =
>include/lldb/Core/StreamAsynchronousIO.h; sourceTree = "<group>"; };
> 9A633FE7112DCE3C001A7E43 /* SBFrame.cpp */ = {isa = PBXFileReference;
>fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name =
>SBFrame.cpp; path = source/API/SBFrame.cpp; sourceTree = "<group>"; };
>
>Modified: lldb/trunk/scripts/Python/python-swigsafecast.swig
>URL:
>http://llvm.org/viewvc/llvm-project/lldb/trunk/scripts/Python/python-swigs
>afecast.swig?rev=184608&r1=184607&r2=184608&view=diff
>==========================================================================
>====
>--- lldb/trunk/scripts/Python/python-swigsafecast.swig (original)
>+++ lldb/trunk/scripts/Python/python-swigsafecast.swig Fri Jun 21
>18:27:16 2013
>@@ -1,7 +1,3 @@
>-#ifndef __cplusplus
>-#error needs C++ to build these
>-#endif
>-
> // leaving this undefined ensures we will get a linker error if we try
>to use SBTypeToSWIGWrapper()
> // for a type for which we did not specialze this function
> template <typename SBClass>
>@@ -15,6 +11,38 @@ SBTypeToSWIGWrapper (SBClass& sb_object)
> return SBTypeToSWIGWrapper(&sb_object);
> }
>
>+template <typename SBClass>
>+PyObject*
>+SBTypeToSWIGWrapper (const SBClass& sb_object)
>+{
>+ return SBTypeToSWIGWrapper(&sb_object);
>+}
>+
>+template <>
>+PyObject*
>+SBTypeToSWIGWrapper (PyObject* py_object)
>+{
>+ return py_object;
>+}
>+
>+template <>
>+PyObject*
>+SBTypeToSWIGWrapper (const char* c_str)
>+{
>+ if (c_str)
>+ return PyString_FromString(c_str);
>+ return NULL;
>+}
>+
>+template <>
>+PyObject*
>+SBTypeToSWIGWrapper (unsigned int* c_int)
>+{
>+ if (!c_int)
>+ return NULL;
>+ return PyInt_FromLong(*c_int);
>+}
>+
> template <>
> PyObject*
> SBTypeToSWIGWrapper (lldb::SBProcess* process_sb)
>
>Modified: lldb/trunk/scripts/Python/python-wrapper.swig
>URL:
>http://llvm.org/viewvc/llvm-project/lldb/trunk/scripts/Python/python-wrapp
>er.swig?rev=184608&r1=184607&r2=184608&view=diff
>==========================================================================
>====
>--- lldb/trunk/scripts/Python/python-wrapper.swig (original)
>+++ lldb/trunk/scripts/Python/python-wrapper.swig Fri Jun 21 18:27:16 2013
>@@ -103,6 +103,97 @@ FindSessionDictionary(const char *sessio
> return ResolvePythonName(session_dictionary_name, NULL);
> }
>
>+class PyCallable
>+{
>+public:
>+
>+ operator
>+ bool ()
>+ {
>+ return m_callable != NULL;
>+ }
>+
>+ template<typename ...Args>
>+ PyObject*
>+ operator () (Args... args)
>+ {
>+ return (*this)({SBTypeToSWIGWrapper(args)...});
>+ }
>+
>+ PyObject*
>+ operator () (std::initializer_list<PyObject*> args)
>+ {
>+ PyObject* retval = NULL;
>+ PyObject* pargs = PyTuple_New (args.size());
>+ if (pargs == NULL)
>+ {
>+ if (PyErr_Occurred())
>+ PyErr_Clear();
>+ return retval;
>+ }
>+ size_t idx = 0;
>+ for (auto arg : args)
>+ {
>+ if (!arg)
>+ return retval;
>+ PyTuple_SetItem(pargs,idx,arg);
>+ idx++;
>+ }
>+ retval = PyObject_CallObject (m_callable, pargs);
>+ Py_XDECREF (pargs);
>+ return retval;
>+ }
>+
>+ static PyCallable
>+ FindWithPythonObject (PyObject* pfunc)
>+ {
>+ return PyCallable(pfunc);
>+ }
>+
>+ static PyCallable
>+ FindWithFunctionName (const char *python_function_name,
>+ const char *session_dictionary_name)
>+ {
>+ if (!python_function_name || !session_dictionary_name)
>+ return PyCallable();
>+ if ( (python_function_name[0] == 0) ||
>(session_dictionary_name[0] == 0) )
>+ return PyCallable();
>+ return
>FindWithFunctionName(python_function_name,FindSessionDictionary
>(session_dictionary_name));
>+ }
>+
>+ static PyCallable
>+ FindWithFunctionName (const char *python_function_name,
>+ PyObject *session_dict)
>+ {
>+ if (!python_function_name || !session_dict)
>+ return PyCallable();
>+ if ( (python_function_name[0] == 0))
>+ return PyCallable();
>+ return PyCallable(ResolvePythonName (python_function_name,
>session_dict));
>+ }
>+
>+ static PyCallable
>+ FindWithMemberFunction (PyObject *self,
>+ const char *python_function_name)
>+ {
>+ if (self == NULL || self == Py_None)
>+ return PyCallable();
>+ if (!python_function_name || (python_function_name[0] == 0))
>+ return PyCallable();
>+ return PyCallable(PyObject_GetAttrString(self,
>python_function_name));
>+ }
>+
>+private:
>+ PyObject* m_callable;
>+
>+ PyCallable (PyObject *callable = NULL) :
>+ m_callable(callable)
>+ {
>+ if (m_callable && PyCallable_Check(m_callable) == false)
>+ m_callable = NULL;
>+ }
>+};
>+
> // This function is called by
>lldb_private::ScriptInterpreterPython::BreakpointCallbackFunction(...)
> // and is used when a script command is attached to a breakpoint for
>execution.
>
>@@ -119,70 +210,27 @@ LLDBSwigPythonBreakpointCallbackFunction
> lldb::SBBreakpointLocation sb_bp_loc(bp_loc_sp);
>
> bool stop_at_breakpoint = true;
>- PyObject *Frame_PyObj = SBTypeToSWIGWrapper(sb_frame);
>- PyObject *Bp_Loc_PyObj = SBTypeToSWIGWrapper(sb_bp_loc);
>-
>- if (Frame_PyObj == NULL || Bp_Loc_PyObj == NULL)
>- return stop_at_breakpoint;
>-
>- if (!python_function_name || !session_dictionary_name)
>- return stop_at_breakpoint;
>
>- PyObject *session_dict, *pfunc;
>- PyObject *pargs, *pvalue;
>-
>- session_dict = FindSessionDictionary (session_dictionary_name);
>- if (session_dict != NULL)
>- {
>- pfunc = ResolvePythonName (python_function_name, session_dict);
>- if (pfunc != NULL)
>- {
>- // Set up the arguments and call the function.
>-
>- if (PyCallable_Check (pfunc))
>- {
>- pargs = PyTuple_New (3);
>- if (pargs == NULL)
>- {
>- if (PyErr_Occurred())
>- PyErr_Clear();
>- return stop_at_breakpoint;
>- }
>-
>- PyTuple_SetItem (pargs, 0, Frame_PyObj); // This
>"steals" a reference to Frame_PyObj
>- PyTuple_SetItem (pargs, 1, Bp_Loc_PyObj); // This
>"steals" a reference to Bp_Loc_PyObj
>- PyTuple_SetItem (pargs, 2, session_dict); // This
>"steals" a reference to session_dict
>- pvalue = PyObject_CallObject (pfunc, pargs);
>- Py_XDECREF (pargs);
>-
>- if (pvalue != NULL)
>- {
>- // be very conservative here and only refuse to stop
>if the user
>- // actually returned False - anything else, just stop
>- if (pvalue == Py_False)
>- stop_at_breakpoint = false;
>- Py_XDECREF (pvalue);
>- }
>- else if (PyErr_Occurred ())
>- {
>- PyErr_Clear();
>- }
>- Py_INCREF (session_dict);
>- }
>- else if (PyErr_Occurred())
>- {
>- PyErr_Clear();
>- }
>- }
>- else if (PyErr_Occurred())
>- {
>- PyErr_Clear();
>- }
>- }
>- else if (PyErr_Occurred ())
> {
>- PyErr_Clear ();
>+ PyErr_Cleaner py_err_cleaner(true);
>+
>+ PyCallable pfunc =
>PyCallable::FindWithFunctionName(python_function_name,session_dictionary_n
>ame);
>+
>+ if (!pfunc)
>+ return stop_at_breakpoint;
>+
>+ PyObject* session_dict = NULL;
>+ PyObject* pvalue = NULL;
>+ pvalue = pfunc(sb_frame, sb_bp_loc, session_dict =
>FindSessionDictionary(session_dictionary_name));
>+
>+ Py_XINCREF (session_dict);
>+
>+ if (pvalue == Py_False)
>+ stop_at_breakpoint = false;
>+
>+ Py_XDECREF (pvalue);
> }
>+
> return stop_at_breakpoint;
> }
>
>@@ -202,67 +250,55 @@ LLDBSwigPythonWatchpointCallbackFunction
> lldb::SBWatchpoint sb_wp(wp_sp);
>
> bool stop_at_watchpoint = true;
>- PyObject *Frame_PyObj = SBTypeToSWIGWrapper(sb_frame);
>- PyObject *Wp_PyObj = SBTypeToSWIGWrapper(sb_wp);
>
>- if (Frame_PyObj == NULL || Wp_PyObj == NULL)
>- return stop_at_watchpoint;
>+ {
>+ PyErr_Cleaner py_err_cleaner(true);
>
>- if (!python_function_name || !session_dictionary_name)
>- return stop_at_watchpoint;
>-
>- PyObject *session_dict, *pfunc;
>- PyObject *pargs, *pvalue;
>+ PyCallable pfunc =
>PyCallable::FindWithFunctionName(python_function_name,session_dictionary_n
>ame);
>+
>+ if (!pfunc)
>+ return stop_at_watchpoint;
>+
>+ PyObject* session_dict = NULL;
>+ PyObject* pvalue = NULL;
>+ pvalue = pfunc(sb_frame, sb_wp, session_dict =
>FindSessionDictionary(session_dictionary_name));
>+
>+ Py_XINCREF (session_dict);
>+
>+ if (pvalue == Py_False)
>+ stop_at_watchpoint = false;
>+
>+ Py_XDECREF (pvalue);
>+ }
>
>- session_dict = FindSessionDictionary (session_dictionary_name);
>- if (session_dict != NULL)
>+ return stop_at_watchpoint;
>+}
>+
>+bool
>+PyObjectToString (PyObject* object,
>+ std::string& retval)
>+{
>+ retval.clear();
>+ bool was_ok = false;
>+ if (object != NULL && object != Py_None)
> {
>- pfunc = ResolvePythonName (python_function_name, session_dict);
>- if (pfunc != NULL)
>+ if (PyString_Check(object))
> {
>- // Set up the arguments and call the function.
>-
>- if (PyCallable_Check (pfunc))
>- {
>- pargs = PyTuple_New (3);
>- if (pargs == NULL)
>- {
>- if (PyErr_Occurred())
>- PyErr_Clear();
>- return stop_at_watchpoint;
>- }
>-
>- PyTuple_SetItem (pargs, 0, Frame_PyObj); // This
>"steals" a reference to Frame_PyObj
>- PyTuple_SetItem (pargs, 1, Wp_PyObj); // This
>"steals" a reference to Wp_PyObj
>- PyTuple_SetItem (pargs, 2, session_dict); // This
>"steals" a reference to session_dict
>- pvalue = PyObject_CallObject (pfunc, pargs);
>- Py_XDECREF (pargs);
>-
>- if (pvalue != NULL)
>- {
>- Py_XDECREF (pvalue);
>- }
>- else if (PyErr_Occurred ())
>- {
>- PyErr_Clear();
>- }
>- Py_INCREF (session_dict);
>- }
>- else if (PyErr_Occurred())
>- {
>- PyErr_Clear();
>- }
>+ retval.assign(PyString_AsString(object));
>+ was_ok = true;
> }
>- else if (PyErr_Occurred())
>+ else
> {
>- PyErr_Clear();
>+ PyObject* value_as_string = PyObject_Str(object);
>+ if (value_as_string && value_as_string != Py_None &&
>PyString_Check(value_as_string))
>+ {
>+ retval.assign(PyString_AsString(value_as_string));
>+ was_ok = true;
>+ }
>+ Py_XDECREF(value_as_string);
> }
> }
>- else if (PyErr_Occurred ())
>- {
>- PyErr_Clear ();
>- }
>- return stop_at_watchpoint;
>+ return was_ok;
> }
>
> SWIGEXPORT bool
>@@ -279,23 +315,18 @@ LLDBSwigPythonCallTypeScript
>
> retval.clear();
>
>- PyObject *ValObj_PyObj = SBTypeToSWIGWrapper(sb_value);
>-
>- if (ValObj_PyObj == NULL)
>- return false;
>-
> if (!python_function_name || !session_dictionary)
> return false;
>
>- PyObject *session_dict = (PyObject*)session_dictionary, *pfunc =
>NULL, *pargs = NULL, *pvalue = NULL;
>+ PyObject *session_dict = (PyObject*)session_dictionary, *pfunc_impl
>= NULL, *pargs = NULL, *pvalue = NULL;
>
> if (pyfunct_wrapper && *pyfunct_wrapper && PyFunction_Check
>(*pyfunct_wrapper))
> {
>- pfunc = (PyObject*)(*pyfunct_wrapper);
>- if (pfunc->ob_refcnt == 1)
>+ pfunc_impl = (PyObject*)(*pyfunct_wrapper);
>+ if (pfunc_impl->ob_refcnt == 1)
> {
>- Py_XDECREF(pfunc);
>- pfunc = NULL;
>+ Py_XDECREF(pfunc_impl);
>+ pfunc_impl = NULL;
> }
> }
>
>@@ -303,41 +334,32 @@ LLDBSwigPythonCallTypeScript
> {
> PyErr_Cleaner pyerr_cleanup(true); // show Python errors
>
>- if (!pfunc)
>+ if (!pfunc_impl)
> {
>- pfunc = ResolvePythonName (python_function_name,
>session_dict);
>- if (!pfunc || !PyFunction_Check (pfunc))
>+ pfunc_impl = ResolvePythonName (python_function_name,
>session_dict);
>+ if (!pfunc_impl || !PyCallable_Check (pfunc_impl))
> return false;
> else
> {
> if (pyfunct_wrapper)
>- *pyfunct_wrapper = pfunc;
>+ *pyfunct_wrapper = pfunc_impl;
> }
> }
> /*else
> printf("caching works!!!!\n");*/
>
>- pargs = PyTuple_Pack(2, ValObj_PyObj, session_dict);
>- if (pargs == NULL)
>+ PyCallable pfunc = PyCallable::FindWithPythonObject(pfunc_impl);
>+
>+ if (!pfunc)
> return false;
>
>- pvalue = PyObject_CallObject (pfunc, pargs);
>- Py_XDECREF (pargs);
>+ pvalue = pfunc(sb_value,session_dict);
>+
>+ Py_INCREF (session_dict);
>+
>+ PyObjectToString(pvalue,retval);
>
>- if (pvalue != NULL && pvalue != Py_None)
>- {
>- if (PyString_Check(pvalue))
>- retval.assign(PyString_AsString(pvalue));
>- else
>- {
>- PyObject* value_as_string = PyObject_Str(pvalue);
>- if (value_as_string && value_as_string != Py_None &&
>PyString_Check(value_as_string))
>- retval.assign(PyString_AsString(value_as_string));
>- Py_XDECREF(value_as_string);
>- }
>- }
> Py_XDECREF (pvalue);
>- Py_INCREF (session_dict);
> }
> return true;
> }
>@@ -359,81 +381,29 @@ LLDBSwigPythonCreateSyntheticProvider
> // has ownership of it and will manage memory for this object by
>itself
> lldb::SBValue *sb_value = new lldb::SBValue(valobj_sp);
> sb_value->SetPreferSyntheticValue(false);
>-
> PyObject *ValObj_PyObj = SBTypeToSWIGWrapper(sb_value);
>
> if (ValObj_PyObj == NULL)
> Py_RETURN_NONE;
>-
>- const char* python_function_name = python_class_name;
>-
>- PyObject *session_dict, *pfunc;
>- PyObject *pvalue;
>
>- session_dict = FindSessionDictionary (session_dictionary_name);
>- if (session_dict != NULL)
>- {
>- pfunc = ResolvePythonName (python_function_name, session_dict);
>- if (pfunc != NULL)
>- {
>- // Set up the arguments and call the function.
>-
>- if (PyCallable_Check (pfunc))
>- {
>- PyObject *argList = Py_BuildValue("SS", ValObj_PyObj,
>session_dict);
>-
>- if (PyErr_Occurred ())
>- {
>- PyErr_Print();
>- PyErr_Clear();
>- return retval;
>- }
>-
>- if (argList == NULL)
>- {
>- return retval;
>- }
>-
>- Py_INCREF(ValObj_PyObj);
>-
>- pvalue = PyObject_CallObject(pfunc, argList);
>-
>- Py_XDECREF(argList);
>-
>- if (pvalue != NULL)
>- {
>- if (pvalue != Py_None)
>- retval = pvalue;
>- else
>- {
>- retval = Py_None;
>- Py_INCREF(retval);
>- }
>- }
>- else if (PyErr_Occurred ())
>- {
>- PyErr_Print();
>- PyErr_Clear();
>- }
>- Py_INCREF (session_dict);
>- }
>- else if (PyErr_Occurred())
>- {
>- PyErr_Print();
>- PyErr_Clear();
>- }
>- }
>- else if (PyErr_Occurred())
>- {
>- PyErr_Print();
>- PyErr_Clear();
>- }
>- }
>- else if (PyErr_Occurred ())
> {
>- PyErr_Print();
>- PyErr_Clear ();
>+ PyErr_Cleaner py_err_cleaner(true);
>+
>+ PyCallable pfunc =
>PyCallable::FindWithFunctionName(python_class_name,session_dictionary_name
>);
>+
>+ if (!pfunc)
>+ return retval;
>+
>+ Py_INCREF(ValObj_PyObj);
>+
>+ PyObject* session_dict = NULL;
>+ retval = pfunc(ValObj_PyObj, session_dict =
>FindSessionDictionary(session_dictionary_name));
>+
>+ Py_XINCREF (session_dict);
>+
>+ Py_XINCREF(retval);
> }
>+
> if (retval)
> return retval;
> else
>@@ -450,64 +420,22 @@ LLDBSwigPython_CallOptionalMember
> bool* was_found = NULL
> )
> {
>- if (self == NULL || self == Py_None)
>- {
>- if (was_found)
>- *was_found = false;
>- Py_XINCREF(ret_if_not_found);
>- return ret_if_not_found;
>- }
>-
>- PyObject* pmeth = PyObject_GetAttrString(self, callee_name);
>-
>- if (PyErr_Occurred())
>- {
>- PyErr_Clear();
>- }
>-
>- if (pmeth == NULL || pmeth == Py_None)
>- {
>- if (was_found)
>- *was_found = false;
>- Py_XDECREF(pmeth);
>- Py_XINCREF(ret_if_not_found);
>- return ret_if_not_found;
>- }
>-
>- if (PyCallable_Check(pmeth) == 0)
>+ PyErr_Cleaner py_err_cleaner(false);
>+
>+ PyCallable pfunc =
>PyCallable::FindWithMemberFunction(self,callee_name);
>+
>+ if (!pfunc)
> {
>- if (PyErr_Occurred())
>- {
>- PyErr_Clear();
>- }
>-
>- Py_XDECREF(pmeth);
> if (was_found)
> *was_found = false;
> Py_XINCREF(ret_if_not_found);
> return ret_if_not_found;
> }
>-
>+
> if (was_found)
> *was_found = true;
>-
>- if (PyErr_Occurred())
>- {
>- PyErr_Clear();
>- }
>-
>- Py_XDECREF(pmeth);
>-
>- // right now we know this function exists and is callable..
>- PyObject* py_return = PyObject_CallMethod(self, callee_name, NULL);
>-
>- // if it fails, print the error but otherwise go on
>- if (PyErr_Occurred())
>- {
>- PyErr_Print();
>- PyErr_Clear();
>- }
>
>+ PyObject* py_return = pfunc();
> return py_return;
> }
>
>@@ -551,14 +479,15 @@ LLDBSwigPython_GetChildAtIndex
> static char callee_name[] = "get_child_at_index";
> static char param_format[] = "i";
>
>- if (implementor == NULL || implementor == Py_None)
>+ PyErr_Cleaner py_err_cleaner(true);
>+
>+ PyCallable pfunc =
>PyCallable::FindWithMemberFunction(implementor,"get_child_at_index");
>+
>+ if (!pfunc)
> return NULL;
>- PyObject* py_return = PyObject_CallMethod(implementor, callee_name,
>param_format, idx);
>- if (PyErr_Occurred())
>- {
>- PyErr_Print();
>- PyErr_Clear();
>- }
>+
>+ PyObject *py_return = NULL;
>+ py_return = pfunc(idx);
>
> if (py_return == NULL || py_return == Py_None)
> {
>@@ -567,7 +496,7 @@ LLDBSwigPython_GetChildAtIndex
> }
>
> lldb::SBValue* sbvalue_ptr = NULL;
>-
>+
> if (SWIG_ConvertPtr(py_return, (void**)&sbvalue_ptr,
>SWIGTYPE_p_lldb__SBValue, 0) == -1)
> {
> Py_XDECREF(py_return);
>@@ -576,8 +505,8 @@ LLDBSwigPython_GetChildAtIndex
>
> if (sbvalue_ptr == NULL)
> return NULL;
>-
>- return py_return;
>+
>+ return py_return;
> }
>
> SWIGEXPORT int
>@@ -587,33 +516,29 @@ LLDBSwigPython_GetIndexOfChildWithName
> const char* child_name
> )
> {
>- static char callee_name[] = "get_child_index";
>- static char param_format[] = "s";
>-
>- if (implementor == NULL || implementor == Py_None)
>- return 0;
>- PyObject* py_return = PyObject_CallMethod(implementor, callee_name,
>param_format, child_name);
>- if (PyErr_Occurred())
>- {
>- PyErr_Print();
>- PyErr_Clear();
>- }
>+ PyErr_Cleaner py_err_cleaner(true);
>+
>+ PyCallable pfunc =
>PyCallable::FindWithMemberFunction(implementor,"get_child_index");
>+
>+ if (!pfunc)
>+ return UINT32_MAX;
>+
>+ PyObject *py_return = NULL;
>+ py_return = pfunc(child_name);
>
> if (py_return == NULL || py_return == Py_None)
> {
> Py_XDECREF(py_return);
> return UINT32_MAX;
> }
>+
> long retval = PyInt_AsLong(py_return);
> Py_XDECREF(py_return);
>+
> if (retval >= 0)
> return (uint32_t)retval;
>- if (PyErr_Occurred())
>- {
>- PyErr_Print();
>- PyErr_Clear();
>- }
>- return 0;
>+
>+ return UINT32_MAX;
> }
>
> SWIGEXPORT bool
>@@ -714,86 +639,39 @@ LLDBSwigPythonCallCommand
>
> bool retval = false;
>
>- PyObject *DebuggerObj_PyObj = SBTypeToSWIGWrapper(debugger_sb);
>- PyObject *CmdRetObj_PyObj = SBTypeToSWIGWrapper(cmd_retobj_sb);
>-
>- if (DebuggerObj_PyObj == NULL)
>- return retval;
>+ {
>+ PyErr_Cleaner py_err_cleaner(true);
>+ PyCallable pfunc =
>PyCallable::FindWithFunctionName(python_function_name,session_dictionary_n
>ame);
>
>- if (CmdRetObj_PyObj == NULL)
>- return retval;
>-
>- if (!python_function_name || !session_dictionary_name)
>- return retval;
>+ if (!pfunc)
>+ return retval;
>
>- PyObject *session_dict, *pfunc;
>- PyObject *pargs, *pvalue;
>-
>- session_dict = FindSessionDictionary (session_dictionary_name);
>- if (session_dict != NULL)
>- {
>- pfunc = ResolvePythonName (python_function_name, session_dict);
>- if (pfunc != NULL)
>+ PyObject* session_dict = 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, &cmd_retobj_sb, session_dict =
>FindSessionDictionary(session_dictionary_name));
>+
>+ Py_XINCREF (session_dict);
>+
>+ if (pvalue != NULL)
> {
>- // Set up the arguments and call the function.
>-
>- if (PyCallable_Check (pfunc))
>+ if (pvalue == Py_None) // no error
> {
>- pargs = PyTuple_New (4);
>- if (pargs == NULL)
>- {
>- if (PyErr_Occurred())
>- PyErr_Clear();
>- return retval;
>- }
>-
>- PyTuple_SetItem (pargs, 0, DebuggerObj_PyObj); // This
>"steals" a reference to DebuggerObj_PyObj
>- PyTuple_SetItem (pargs, 1, PyString_FromString(args));
>- PyTuple_SetItem (pargs, 2, CmdRetObj_PyObj); // This
>"steals" a reference to CmdRetObj_PyObj
>- PyTuple_SetItem (pargs, 3, session_dict); // This
>"steals" a reference to session_dict
>- pvalue = PyObject_CallObject (pfunc, pargs);
>- Py_XDECREF (pargs);
>-
>- if (pvalue != NULL)
>- {
>- if (pvalue == Py_None) // no error
>- {
>- err_msg.clear();
>- retval = true;
>- }
>- else
>- {
>- // return value is an error string
>- if (PyString_CheckExact(pvalue))
>- err_msg.assign(PyString_AsString(pvalue));
>- retval = false;
>- }
>- Py_XDECREF (pvalue);
>- }
>- else if (PyErr_Occurred ())
>- {
>- PyErr_Print();
>- PyErr_Clear();
>- }
>- Py_INCREF (session_dict);
>+ err_msg.clear();
>+ retval = true;
> }
>- else if (PyErr_Occurred())
>+ else
> {
>- PyErr_Print();
>- PyErr_Clear();
>+ // return value is an error string
>+ PyObjectToString(pvalue,err_msg);
>+ retval = false;
> }
> }
>- else if (PyErr_Occurred())
>- {
>- PyErr_Print();
>- PyErr_Clear();
>- }
>- }
>- else if (PyErr_Occurred ())
>- {
>- PyErr_Print();
>- PyErr_Clear ();
>+
>+ Py_XDECREF (pvalue);
> }
>+
> return retval;
> }
>
>@@ -819,75 +697,24 @@ LLDBSWIGPythonCreateOSPlugin
> if (SBProc_PyObj == NULL)
> Py_RETURN_NONE;
>
>- const char* python_function_name = python_class_name;
>-
>- PyObject *session_dict, *pfunc;
>- PyObject *pvalue;
>-
>- session_dict = FindSessionDictionary (session_dictionary_name);
>- if (session_dict != NULL)
>- {
>- pfunc = ResolvePythonName (python_function_name, session_dict);
>- if (pfunc != NULL)
>- {
>- // Set up the arguments and call the function.
>-
>- if (PyCallable_Check (pfunc))
>- {
>- PyObject *argList = Py_BuildValue("(O)", SBProc_PyObj);
>-
>- if (PyErr_Occurred ())
>- {
>- PyErr_Print();
>- PyErr_Clear();
>- return retval;
>- }
>-
>- if (argList == NULL)
>- {
>- return retval;
>- }
>-
>- Py_INCREF(SBProc_PyObj);
>-
>- pvalue = PyObject_CallObject(pfunc, argList);
>-
>- Py_XDECREF(argList);
>-
>- if (pvalue != NULL)
>- {
>- if (pvalue != Py_None)
>- retval = pvalue;
>- else
>- {
>- retval = Py_None;
>- Py_INCREF(retval);
>- }
>- }
>- else if (PyErr_Occurred ())
>- {
>- PyErr_Print();
>- PyErr_Clear();
>- }
>- Py_INCREF (session_dict);
>- }
>- else if (PyErr_Occurred())
>- {
>- PyErr_Print();
>- PyErr_Clear();
>- }
>- }
>- else if (PyErr_Occurred())
>- {
>- PyErr_Print();
>- PyErr_Clear();
>- }
>- }
>- else if (PyErr_Occurred ())
> {
>- PyErr_Print();
>- PyErr_Clear ();
>+ PyErr_Cleaner py_err_cleaner(true);
>+
>+ PyCallable pfunc =
>PyCallable::FindWithFunctionName(python_class_name,session_dictionary_name
>);
>+
>+ if (!pfunc)
>+ return retval;
>+
>+ Py_INCREF(SBProc_PyObj);
>+
>+ PyObject* session_dict = NULL;
>+ retval = pfunc(SBProc_PyObj, session_dict =
>FindSessionDictionary(session_dictionary_name));
>+
>+ Py_XINCREF (session_dict);
>+
>+ Py_XINCREF(retval);
> }
>+
> if (retval)
> return retval;
> else
>@@ -908,75 +735,27 @@ std::string& output)
> return retval;
>
> lldb::SBProcess process_sb(process);
>- PyObject *ProcessObj_PyObj = SBTypeToSWIGWrapper(process_sb);
>
>- if (ProcessObj_PyObj == NULL)
>- return retval;
>+ {
>+ PyErr_Cleaner py_err_cleaner(true);
>
>- PyObject *session_dict, *pfunc;
>- PyObject *pargs, *pvalue;
>-
>- session_dict = FindSessionDictionary (session_dictionary_name);
>+ PyCallable pfunc =
>PyCallable::FindWithFunctionName(python_function_name,session_dictionary_n
>ame);
>
>- if (session_dict != NULL)
>- {
>- pfunc = ResolvePythonName (python_function_name, session_dict);
>+ if (!pfunc)
>+ return retval;
>
>- if (PyErr_Occurred()) // this might not exist.. let's make sure
>we handle that
>- {
>- PyErr_Clear();
>- return true;
>- }
>-
>- if (pfunc == NULL)
>- return true;
>- else
>- {
>- // Set up the arguments and call the function.
>-
>- if (PyCallable_Check (pfunc))
>- {
>- pargs = PyTuple_New (2);
>- if (pargs == NULL)
>- {
>- if (PyErr_Occurred())
>- PyErr_Clear();
>- return retval;
>- }
>-
>- PyTuple_SetItem (pargs, 0, ProcessObj_PyObj); // This
>"steals" a reference to ProcessObj_PyObj
>- PyTuple_SetItem (pargs, 1, session_dict); // This
>"steals" a reference to session_dict
>- pvalue = PyObject_CallObject (pfunc, pargs);
>- Py_XDECREF (pargs);
>-
>- if (PyErr_Occurred ())
>- {
>- PyErr_Print();
>- PyErr_Clear();
>- }
>- else
>- {
>- if (PyString_Check(pvalue))
>- {
>- output.assign(PyString_AsString(pvalue));
>- retval = true;
>- }
>- else
>- {
>- output.clear();
>- retval = false;
>- }
>- Py_XDECREF (pvalue);
>- }
>- Py_INCREF (session_dict);
>- }
>- else if (PyErr_Occurred())
>- {
>- PyErr_Print();
>- PyErr_Clear();
>- }
>- }
>+ PyObject* session_dict = NULL;
>+ PyObject* pvalue = NULL;
>+ pvalue = pfunc(process_sb, session_dict =
>FindSessionDictionary(session_dictionary_name));
>+
>+ Py_XINCREF (session_dict);
>+
>+ if (PyObjectToString(pvalue,output))
>+ retval = true;
>+
>+ Py_XDECREF(pvalue);
> }
>+
> return retval;
> }
>
>@@ -994,75 +773,27 @@ std::string& output)
> return retval;
>
> lldb::SBThread thread_sb(thread);
>- PyObject *ThreadObj_PyObj = SBTypeToSWIGWrapper(thread_sb);
>-
>- if (ThreadObj_PyObj == NULL)
>- return retval;
>-
>- PyObject *session_dict, *pfunc;
>- PyObject *pargs, *pvalue;
>
>- session_dict = FindSessionDictionary (session_dictionary_name);
>-
>- if (session_dict != NULL)
> {
>- pfunc = ResolvePythonName (python_function_name, session_dict);
>+ PyErr_Cleaner py_err_cleaner(true);
>
>- if (PyErr_Occurred()) // this might not exist.. let's make sure
>we handle that
>- {
>- PyErr_Clear();
>- return true;
>- }
>-
>- if (pfunc == NULL)
>- return true;
>- else
>- {
>- // Set up the arguments and call the function.
>-
>- if (PyCallable_Check (pfunc))
>- {
>- pargs = PyTuple_New (2);
>- if (pargs == NULL)
>- {
>- if (PyErr_Occurred())
>- PyErr_Clear();
>- return retval;
>- }
>-
>- PyTuple_SetItem (pargs, 0, ThreadObj_PyObj); // This
>"steals" a reference to ThreadObj_PyObj
>- PyTuple_SetItem (pargs, 1, session_dict); // This
>"steals" a reference to session_dict
>- pvalue = PyObject_CallObject (pfunc, pargs);
>- Py_XDECREF (pargs);
>-
>- if (PyErr_Occurred ())
>- {
>- PyErr_Print();
>- PyErr_Clear();
>- }
>- else
>- {
>- if (PyString_Check(pvalue))
>- {
>- output.assign(PyString_AsString(pvalue));
>- retval = true;
>- }
>- else
>- {
>- output.clear();
>- retval = false;
>- }
>- Py_XDECREF (pvalue);
>- }
>- Py_INCREF (session_dict);
>- }
>- else if (PyErr_Occurred())
>- {
>- PyErr_Print();
>- PyErr_Clear();
>- }
>- }
>+ PyCallable pfunc =
>PyCallable::FindWithFunctionName(python_function_name,session_dictionary_n
>ame);
>+
>+ if (!pfunc)
>+ return retval;
>+
>+ PyObject* session_dict = NULL;
>+ PyObject* pvalue = NULL;
>+ pvalue = pfunc(thread_sb, session_dict =
>FindSessionDictionary(session_dictionary_name));
>+
>+ Py_XINCREF (session_dict);
>+
>+ if (PyObjectToString(pvalue,output))
>+ retval = true;
>+
>+ Py_XDECREF(pvalue);
> }
>+
> return retval;
> }
>
>@@ -1080,75 +811,27 @@ std::string& output)
> return retval;
>
> lldb::SBTarget target_sb(target);
>- PyObject *TargetObj_PyObj = SBTypeToSWIGWrapper(target_sb);
>-
>- if (TargetObj_PyObj == NULL)
>- return retval;
>-
>- PyObject *session_dict, *pfunc;
>- PyObject *pargs, *pvalue;
>
>- session_dict = FindSessionDictionary (session_dictionary_name);
>-
>- if (session_dict != NULL)
> {
>- pfunc = ResolvePythonName (python_function_name, session_dict);
>+ PyErr_Cleaner py_err_cleaner(true);
>
>- if (PyErr_Occurred()) // this might not exist.. let's make sure
>we handle that
>- {
>- PyErr_Clear();
>- return true;
>- }
>-
>- if (pfunc == NULL)
>- return true;
>- else
>- {
>- // Set up the arguments and call the function.
>-
>- if (PyCallable_Check (pfunc))
>- {
>- pargs = PyTuple_New (2);
>- if (pargs == NULL)
>- {
>- if (PyErr_Occurred())
>- PyErr_Clear();
>- return retval;
>- }
>-
>- PyTuple_SetItem (pargs, 0, TargetObj_PyObj); // This
>"steals" a reference to TargetObj_PyObj
>- PyTuple_SetItem (pargs, 1, session_dict); // This
>"steals" a reference to session_dict
>- pvalue = PyObject_CallObject (pfunc, pargs);
>- Py_XDECREF (pargs);
>-
>- if (PyErr_Occurred ())
>- {
>- PyErr_Print();
>- PyErr_Clear();
>- }
>- else
>- {
>- if (PyString_Check(pvalue))
>- {
>- output.assign(PyString_AsString(pvalue));
>- retval = true;
>- }
>- else
>- {
>- output.clear();
>- retval = false;
>- }
>- Py_XDECREF (pvalue);
>- }
>- Py_INCREF (session_dict);
>- }
>- else if (PyErr_Occurred())
>- {
>- PyErr_Print();
>- PyErr_Clear();
>- }
>- }
>+ PyCallable pfunc =
>PyCallable::FindWithFunctionName(python_function_name,session_dictionary_n
>ame);
>+
>+ if (!pfunc)
>+ return retval;
>+
>+ PyObject* session_dict = NULL;
>+ PyObject* pvalue = NULL;
>+ pvalue = pfunc(target_sb, session_dict =
>FindSessionDictionary(session_dictionary_name));
>+
>+ Py_XINCREF (session_dict);
>+
>+ if (PyObjectToString(pvalue,output))
>+ retval = true;
>+
>+ Py_XDECREF(pvalue);
> }
>+
> return retval;
> }
>
>@@ -1166,75 +849,27 @@ std::string& output)
> return retval;
>
> lldb::SBFrame frame_sb(frame);
>- PyObject *FrameObj_PyObj = SBTypeToSWIGWrapper(frame_sb);
>-
>- if (FrameObj_PyObj == NULL)
>- return retval;
>-
>- PyObject *session_dict, *pfunc;
>- PyObject *pargs, *pvalue;
>
>- session_dict = FindSessionDictionary (session_dictionary_name);
>-
>- if (session_dict != NULL)
> {
>- pfunc = ResolvePythonName (python_function_name, session_dict);
>+ PyErr_Cleaner py_err_cleaner(true);
>
>- if (PyErr_Occurred()) // this might not exist.. let's make sure
>we handle that
>- {
>- PyErr_Clear();
>- return true;
>- }
>-
>- if (pfunc == NULL)
>- return true;
>- else
>- {
>- // Set up the arguments and call the function.
>-
>- if (PyCallable_Check (pfunc))
>- {
>- pargs = PyTuple_New (2);
>- if (pargs == NULL)
>- {
>- if (PyErr_Occurred())
>- PyErr_Clear();
>- return retval;
>- }
>-
>- PyTuple_SetItem (pargs, 0, FrameObj_PyObj); // This
>"steals" a reference to FrameObj_PyObj
>- PyTuple_SetItem (pargs, 1, session_dict); // This
>"steals" a reference to session_dict
>- pvalue = PyObject_CallObject (pfunc, pargs);
>- Py_XDECREF (pargs);
>-
>- if (PyErr_Occurred ())
>- {
>- PyErr_Print();
>- PyErr_Clear();
>- }
>- else
>- {
>- if (PyString_Check(pvalue))
>- {
>- output.assign(PyString_AsString(pvalue));
>- retval = true;
>- }
>- else
>- {
>- output.clear();
>- retval = false;
>- }
>- Py_XDECREF (pvalue);
>- }
>- Py_INCREF (session_dict);
>- }
>- else if (PyErr_Occurred())
>- {
>- PyErr_Print();
>- PyErr_Clear();
>- }
>- }
>+ PyCallable pfunc =
>PyCallable::FindWithFunctionName(python_function_name,session_dictionary_n
>ame);
>+
>+ if (!pfunc)
>+ return retval;
>+
>+ PyObject* session_dict = NULL;
>+ PyObject* pvalue = NULL;
>+ pvalue = pfunc(frame_sb, session_dict =
>FindSessionDictionary(session_dictionary_name));
>+
>+ Py_XINCREF (session_dict);
>+
>+ if (PyObjectToString(pvalue,output))
>+ retval = true;
>+
>+ Py_XDECREF(pvalue);
> }
>+
> return retval;
> }
>
>@@ -1246,78 +881,33 @@ LLDBSwigPythonCallModuleInit
> lldb::DebuggerSP& debugger
> )
> {
>-
>- lldb::SBDebugger debugger_sb(debugger);
>-
> bool retval = false;
>
>- PyObject *DebuggerObj_PyObj = SBTypeToSWIGWrapper(debugger_sb);
>-
>- if (DebuggerObj_PyObj == NULL)
>- return retval;
>-
>- if (python_module_name == NULL || python_module_name[0] == '\0' ||
>!session_dictionary_name)
>- return retval;
>+ lldb::SBDebugger debugger_sb(debugger);
>
>- PyObject *session_dict, *pfunc;
>- PyObject *pargs, *pvalue;
>-
>- session_dict = FindSessionDictionary (session_dictionary_name);
>-
> std::string python_function_name_string = python_module_name;
> python_function_name_string += ".__lldb_init_module";
> const char* python_function_name =
>python_function_name_string.c_str();
>
>- if (session_dict != NULL)
> {
>- pfunc = ResolvePythonName (python_function_name, session_dict);
>+ PyErr_Cleaner py_err_cleaner(true);
>
>- if (PyErr_Occurred()) // this might not exist.. let's make sure
>we handle that
>- {
>- PyErr_Clear();
>- return true;
>- }
>-
>- if (pfunc == NULL)
>+ PyCallable pfunc =
>PyCallable::FindWithFunctionName(python_function_name,session_dictionary_n
>ame);
>+
>+ if (!pfunc)
> return true;
>- else
>- {
>- // Set up the arguments and call the function.
>-
>- if (PyCallable_Check (pfunc))
>- {
>- pargs = PyTuple_New (2);
>- if (pargs == NULL)
>- {
>- if (PyErr_Occurred())
>- PyErr_Clear();
>- return retval;
>- }
>-
>- PyTuple_SetItem (pargs, 0, DebuggerObj_PyObj); // This
>"steals" a reference to DebuggerObj_PyObj
>- PyTuple_SetItem (pargs, 1, session_dict); // This
>"steals" a reference to session_dict
>- pvalue = PyObject_CallObject (pfunc, pargs);
>- Py_XDECREF (pargs);
>-
>- if (PyErr_Occurred ())
>- {
>- PyErr_Print();
>- PyErr_Clear();
>- }
>- else
>- {
>- retval = true;
>- Py_XDECREF (pvalue);
>- }
>- Py_INCREF (session_dict);
>- }
>- else if (PyErr_Occurred())
>- {
>- PyErr_Print();
>- PyErr_Clear();
>- }
>- }
>+
>+ PyObject* session_dict = NULL;
>+ PyObject* pvalue = NULL;
>+ pvalue = pfunc(debugger_sb, session_dict =
>FindSessionDictionary(session_dictionary_name));
>+
>+ Py_XINCREF (session_dict);
>+
>+ retval = true;
>+
>+ Py_XDECREF(pvalue);
> }
>+
> return retval;
> }
> %}
>
>Modified: lldb/trunk/test/help/TestHelp.py
>URL:
>http://llvm.org/viewvc/llvm-project/lldb/trunk/test/help/TestHelp.py?rev=1
>84608&r1=184607&r2=184608&view=diff
>==========================================================================
>====
>--- lldb/trunk/test/help/TestHelp.py (original)
>+++ lldb/trunk/test/help/TestHelp.py Fri Jun 21 18:27:16 2013
>@@ -124,7 +124,7 @@ class HelpCommandTestCase(TestBase):
> """Command 'help image du line' is not ambiguous and should
>work."""
> # 'image' is an alias for 'target modules'.
> self.expect("help image du line",
>- substrs = ['Dump the debug symbol file for one or more
>target modules'])
>+ substrs = ['Dump the line table for one or more compilation
>units'])
>
> def test_help_target_variable_syntax(self):
> """Command 'help target variable' should display <variable-name>
>..."""
>
>
>_______________________________________________
>lldb-commits mailing list
>lldb-commits at cs.uiuc.edu
>http://lists.cs.uiuc.edu/mailman/listinfo/lldb-commits
More information about the lldb-commits
mailing list