summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Malcolm <dmalcolm@redhat.com>2010-02-04 14:23:03 -0500
committerDavid Malcolm <dmalcolm@redhat.com>2010-02-04 14:23:03 -0500
commit0016aaed5aa060ed4a7c024228c431a44edc39e3 (patch)
tree555df890558e6c6b12e98c0e2f064a78a2524670
parent9c02ed624ab7e794ccc36a8d1d7fcfe2cff1a854 (diff)
downloadlibpython-0016aaed5aa060ed4a7c024228c431a44edc39e3.tar.gz
libpython-0016aaed5aa060ed4a7c024228c431a44edc39e3.tar.xz
libpython-0016aaed5aa060ed4a7c024228c431a44edc39e3.zip
support instances of old-style classes
-rw-r--r--libpython.py33
1 files changed, 32 insertions, 1 deletions
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 <classobj>
+ instance within the process being debugged.
+ """
+ _typename = 'PyClassObject'
+
class PyCodeObjectPtr(PyObjectPtr):
"""
Class wrapping a gdb.Value that's a PyCodeObject* i.e. a <code> 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'