[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