From 0016aaed5aa060ed4a7c024228c431a44edc39e3 Mon Sep 17 00:00:00 2001 From: David Malcolm Date: Thu, 4 Feb 2010 14:23:03 -0500 Subject: support instances of old-style classes --- libpython.py | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/libpython.py b/libpython.py index dc93177..3f843db 100644 --- a/libpython.py +++ b/libpython.py @@ -166,7 +166,9 @@ class PyObjectPtr(object): else: return PyIntObjectPtr - name_map = {'dict': PyDictObjectPtr, + name_map = {'classobj': PyClassObjectPtr, + 'dict': PyDictObjectPtr, + 'instance': PyInstanceObjectPtr, 'list': PyListObjectPtr, 'long': PyLongObjectPtr, 'tuple': PyTupleObjectPtr, @@ -213,6 +215,13 @@ class PyObjectPtr(object): def get_gdb_type(cls): return gdb.lookup_type(cls._typename).pointer() +class PyClassObjectPtr(PyObjectPtr): + """ + Class wrapping a gdb.Value that's a PyClassObject* i.e. a + instance within the process being debugged. + """ + _typename = 'PyClassObject' + class PyCodeObjectPtr(PyObjectPtr): """ Class wrapping a gdb.Value that's a PyCodeObject* i.e. a instance @@ -237,6 +246,28 @@ class PyDictObjectPtr(PyObjectPtr): result[pkey.proxyval()] = pvalue.proxyval() return result +class PyInstanceObjectPtr(PyObjectPtr): + _typename = 'PyInstanceObject' + + def proxyval(self): + class InstanceProxy(object): + def __init__(self, cl_name, attrdict, address): + self.cl_name = cl_name + self.attrdict = attrdict + self.address = address + + def __repr__(self): + return '<%s(%s) at remote 0x%x>' % (self.cl_name, self.attrdict, self.address) + + # Get name of class: + in_class = PyObjectPtr.from_pyobject_ptr(self.field('in_class')) + cl_name = PyObjectPtr.from_pyobject_ptr(in_class.field('cl_name')).proxyval() + + # Get dictionary of instance attributes: + in_dict = PyObjectPtr.from_pyobject_ptr(self.field('in_dict')).proxyval() + + return InstanceProxy(cl_name, in_dict, long(self._gdbval)) + class PyIntObjectPtr(PyObjectPtr): _typename = 'PyIntObject' -- cgit