[pypy-svn] r27514 - pypy/dist/pypy/translator/tool
arigo at codespeak.net
arigo at codespeak.net
Sat May 20 19:30:13 CEST 2006
Author: arigo
Date: Sat May 20 19:30:12 2006
New Revision: 27514
Modified:
pypy/dist/pypy/translator/tool/lltracker.py
pypy/dist/pypy/translator/tool/reftracker.py
Log:
(pedronis sleepy, arigo)
Debugging the debugger. (fight fight fight)
Modified: pypy/dist/pypy/translator/tool/lltracker.py
==============================================================================
--- pypy/dist/pypy/translator/tool/lltracker.py (original)
+++ pypy/dist/pypy/translator/tool/lltracker.py Sat May 20 19:30:12 2006
@@ -12,6 +12,10 @@
class LLRefTrackerPage(BaseRefTrackerPage):
+ def compute(self, objectlist, size_gc_header):
+ self.size_gc_header = size_gc_header
+ return BaseRefTrackerPage.compute(self, objectlist)
+
def formatobject(self, o):
lines = []
for name, value in self.enum_content(o):
@@ -37,8 +41,18 @@
slst.append(name)
return '/'.join(slst)
- def enum_content(cls, o, name=''):
+ def newpage(self, objectlist):
+ return self.__class__(objectlist, self.size_gc_header)
+
+ def enum_content(self, o, name='', with_header=True):
+ # XXX clean up
T = lltype.typeOf(o)
+ if (self.size_gc_header is not None and with_header
+ and isinstance(T, lltype.GC_CONTAINER)):
+ adr = llmemory.cast_ptr_to_adr(o._as_ptr())
+ adr -= self.size_gc_header
+ o = adr.get()._obj
+ T = lltype.typeOf(o)
if isinstance(T, lltype.Struct):
try:
gcobjptr = header2obj[o]
@@ -47,26 +61,33 @@
gcobjptr = None
fmt = '%s'
for name in T._names:
- for name, value in cls.enum_content(getattr(o, name), name):
+ for name, value in self.enum_content(getattr(o, name), name,
+ with_header=False):
yield fmt % (name,), value
if gcobjptr:
GCT = lltype.typeOf(gcobjptr)
- yield 'header of', '<%s>' % (shorttypename(GCT.TO),)
- for sub in cls.enum_content(gcobjptr._obj):
- yield sub
+ if self.size_gc_header is not None:
+ yield 'header of', '<%s>' % (shorttypename(GCT.TO),)
+ for sub in self.enum_content(gcobjptr._obj,
+ with_header=False):
+ yield sub
+ else:
+ # display as a link to avoid the same data showing up
+ # twice in the graph
+ yield 'header of', gcobjptr._obj
elif isinstance(T, lltype.Array):
for index, o1 in enumerate(o.items):
- for sub in cls.enum_content(o1, str(index)):
+ for sub in self.enum_content(o1, str(index)):
yield sub
elif isinstance(T, lltype.Ptr):
if not o:
yield name, 'null'
else:
- yield name, o._obj
+ yield name, lltype.normalizeptr(o)._obj
elif isinstance(T, lltype.OpaqueType) and hasattr(o, 'container'):
T = lltype.typeOf(o.container)
yield 'container', '<%s>' % (shorttypename(T),)
- for sub in cls.enum_content(o.container, name):
+ for sub in self.enum_content(o.container, name, with_header=False):
yield sub
elif T == llmemory.Address:
if not o:
@@ -84,7 +105,6 @@
yield '... offset', str(o.offset)
else:
yield name, str(o)
- enum_content = classmethod(enum_content)
def shorttypename(T):
return '%s %s' % (T.__class__.__name__, getattr(T, '__name__', ''))
@@ -93,16 +113,23 @@
def track(*ll_objects):
"""Invoke a dot+pygame object reference tracker."""
lst = [MARKER]
+ size_gc_header = None
for ll_object in ll_objects:
+ if isinstance(ll_object, llmemory.GCHeaderOffset):
+ size_gc_header = ll_object
+ continue
if isinstance(lltype.typeOf(ll_object), lltype.Ptr):
- ll_object = ll_object._obj
- lst.append(ll_object)
- if len(ll_objects) == 1:
+ ll_object = lltype.normalizeptr(ll_object)._obj
+ if ll_object not in lst:
+ lst.append(ll_object)
+ page = LLRefTrackerPage(lst, size_gc_header)
+ if len(lst) == 2:
# auto-expand one level
- for name, value in LLRefTrackerPage.enum_content(ll_objects[0]):
- if not isinstance(value, str):
+ page = page.content()
+ for name, value in page.enum_content(lst[1]):
+ if not isinstance(value, str) and value not in lst:
lst.append(value)
- page = LLRefTrackerPage(lst)
+ page = page.newpage(lst)
page.display()
Modified: pypy/dist/pypy/translator/tool/reftracker.py
==============================================================================
--- pypy/dist/pypy/translator/tool/reftracker.py (original)
+++ pypy/dist/pypy/translator/tool/reftracker.py Sat May 20 19:30:12 2006
@@ -79,7 +79,7 @@
objectlist = objectlist + [found]
else:
print '*** NOTE: object not found'
- return self.__class__(objectlist)
+ return self.newpage(objectlist)
def formatobject(self, o):
s = repr(o)
@@ -93,6 +93,9 @@
def edgelabel(self, o1, o2):
return ''
+ def newpage(self, objectlist):
+ return self.__class__(objectlist)
+
class RefTrackerPage(BaseRefTrackerPage):
More information about the Pypy-commit
mailing list