[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