[pypy-svn] r5948 - in pypy/trunk/src: goal/translate_pypy pypy/translator

arigo at codespeak.net arigo at codespeak.net
Fri Aug 13 16:27:57 CEST 2004


Author: arigo
Date: Fri Aug 13 16:27:57 2004
New Revision: 5948

Modified:
   pypy/trunk/src/goal/translate_pypy/graphserver.py
   pypy/trunk/src/pypy/translator/annrpython.py
Log:
Record and display the whole history of the bindings of each variable.


Modified: pypy/trunk/src/goal/translate_pypy/graphserver.py
==============================================================================
--- pypy/trunk/src/goal/translate_pypy/graphserver.py	(original)
+++ pypy/trunk/src/goal/translate_pypy/graphserver.py	Fri Aug 13 16:27:57 2004
@@ -1,6 +1,7 @@
 import BaseHTTPServer
 from cStringIO import StringIO
 import httpserver
+from httpserver import htmlquote
 from pypy.translator.tool.pygame.graphviewer import GraphViewer
 from pypy.translator.tool.make_dot import make_dot_graphs
 
@@ -11,8 +12,11 @@
         self.translator = translator
         self.viewercache = {}
         self.binding_by_name = {}
+        self.binding_history = {}
         for var, s_value in self.translator.annotator.bindings.items():
             self.binding_by_name[var.name] = '%s :  %r' % (var.name, s_value)
+        for var, history in self.translator.annotator.bindingshistory.items():
+            self.binding_history[var.name] = history
 
     def getviewer(self, i):
         t = self.translator
@@ -54,10 +58,22 @@
 
     def varloader(self, n, **options):
         n = n[0]
-        import textwrap
-        data = textwrap.fill(self.binding_by_name[n])
-        data = '=== %s ===\n\n%s' % (n, data)
-        return StringIO(data), 'text/plain'
+        s = self.binding_by_name[n]
+        assert s.startswith('%s :' % n)
+        s = s[len('%s :' % n):]
+        data = '<html><head><title>%s</title></head><body>' % n
+        data += '<h1>%s</h1>' % n
+        data += '<p>%s</p>' % htmlquote(s)
+        if n in self.binding_history:
+            lines = ['<li>%s' % htmlquote(repr(s))
+                     for s in self.binding_history[n]]
+            lines.reverse()
+            data += '<h2>Previous values</h2>'
+            data += '<ul>'
+            data += '\n'.join(lines)
+            data += '</ul>'
+        data += '</body></html>'
+        return StringIO(data), 'text/html'
 
     def serve(self, port=8000):
         httpserver.register('', self.indexloader)

Modified: pypy/trunk/src/pypy/translator/annrpython.py
==============================================================================
--- pypy/trunk/src/pypy/translator/annrpython.py	(original)
+++ pypy/trunk/src/pypy/translator/annrpython.py	Fri Aug 13 16:27:57 2004
@@ -24,6 +24,7 @@
         self.bindings = {}       # map Variables to SomeValues
         self.annotated = {}      # set of blocks already seen
         self.notify = {}         # {block: {factory-to-invalidate-when-done}}
+        self.bindingshistory = {}# map Variables to lists of SomeValues
         self.bookkeeper = Bookkeeper(self)
 
     #___ convenience high-level interface __________________
@@ -117,6 +118,14 @@
         else:
             raise TypeError, 'Variable or Constant expected, got %r' % (arg,)
 
+    def setbinding(self, arg, s_value):
+        if arg in self.bindings:
+            # for debugging purposes, record the history of bindings that
+            # have been given to this variable
+            history = self.bindingshistory.setdefault(arg, [])
+            history.append(self.bindings[arg])
+        self.bindings[arg] = s_value
+
 
     #___ interface for annotator.factory _______
 
@@ -246,7 +255,7 @@
     def bindinputargs(self, block, inputcells):
         # Create the initial bindings for the input args of a block.
         for a, cell in zip(block.inputargs, inputcells):
-            self.bindings[a] = cell
+            self.setbinding(a, cell)
         self.annotated[block] = False  # must flowin.
 
     def mergeinputargs(self, block, inputcells):
@@ -288,7 +297,7 @@
             raise BlockedInference  # the operation cannot succeed
         assert isinstance(resultcell, annmodel.SomeObject)
         assert isinstance(op.result, Variable)
-        self.bindings[op.result] = resultcell   # bind resultcell to op.result
+        self.setbinding(op.result, resultcell)  # bind resultcell to op.result
 
     def default_consider_op(self, *args):
         return annmodel.SomeObject()



More information about the Pypy-commit mailing list