summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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'