diff options
Diffstat (limited to 'Tools/gdb/libpython.py')
| -rwxr-xr-x | Tools/gdb/libpython.py | 53 | 
1 files changed, 48 insertions, 5 deletions
| diff --git a/Tools/gdb/libpython.py b/Tools/gdb/libpython.py index 0903c01766..cca9741ced 100755 --- a/Tools/gdb/libpython.py +++ b/Tools/gdb/libpython.py @@ -362,6 +362,7 @@ class PyObjectPtr(object):                      'set' : PySetObjectPtr,                      'frozenset' : PySetObjectPtr,                      'builtin_function_or_method' : PyCFunctionObjectPtr, +                    'method-wrapper': wrapperobject,                      }          if tp_name in name_map:              return name_map[tp_name] @@ -1330,6 +1331,39 @@ class PyUnicodeObjectPtr(PyObjectPtr):          out.write(quote) +class wrapperobject(PyObjectPtr): +    _typename = 'wrapperobject' + +    def safe_name(self): +        try: +            name = self.field('descr')['d_base']['name'].string() +            return repr(name) +        except (NullPyObjectPtr, RuntimeError): +            return '<unknown name>' + +    def safe_tp_name(self): +        try: +            return self.field('self')['ob_type']['tp_name'].string() +        except (NullPyObjectPtr, RuntimeError): +            return '<unknown tp_name>' + +    def safe_self_addresss(self): +        try: +            address = long(self.field('self')) +            return '%#x' % address +        except (NullPyObjectPtr, RuntimeError): +            return '<failed to get self address>' + +    def proxyval(self, visited): +        name = self.safe_name() +        tp_name = self.safe_tp_name() +        self_address = self.safe_self_addresss() +        return ("<method-wrapper %s of %s object at %s>" +                % (name, tp_name, self_address)) + +    def write_repr(self, out, visited): +        proxy = self.proxyval(visited) +        out.write(proxy)  def int_from_int(gdbval): @@ -1364,11 +1398,13 @@ class PyObjectPtrPrinter:  def pretty_printer_lookup(gdbval):      type = gdbval.type.unqualified() -    if type.code == gdb.TYPE_CODE_PTR: -        type = type.target().unqualified() -        t = str(type) -        if t in ("PyObject", "PyFrameObject", "PyUnicodeObject"): -            return PyObjectPtrPrinter(gdbval) +    if type.code != gdb.TYPE_CODE_PTR: +        return None + +    type = type.target().unqualified() +    t = str(type) +    if t in ("PyObject", "PyFrameObject", "PyUnicodeObject", "wrapperobject"): +        return PyObjectPtrPrinter(gdbval)  """  During development, I've been manually invoking the code in this way: @@ -1520,6 +1556,13 @@ class Frame(object):              except RuntimeError:                  return 'PyCFunction invocation (unable to read %s)' % arg_name +        if caller == 'wrapper_call': +            try: +                func = frame.read_var('wp') +                return str(func) +            except RuntimeError: +                return '<wrapper_call invocation>' +          # This frame isn't worth reporting:          return False | 
