[pypy-svn] r5384 - in pypy/trunk/src: goal goal/translate_pypy pypy/translator/tool/pygame

arigo at codespeak.net arigo at codespeak.net
Mon Jun 28 17:53:50 CEST 2004


Author: arigo
Date: Mon Jun 28 17:53:49 2004
New Revision: 5384

Added:
   pypy/trunk/src/goal/translate_pypy/   (props changed)
   pypy/trunk/src/goal/translate_pypy/autopath.py
      - copied, changed from r5382, pypy/trunk/src/goal/autopath.py
   pypy/trunk/src/goal/translate_pypy/func.html
   pypy/trunk/src/goal/translate_pypy/graphserver.py   (contents, props changed)
   pypy/trunk/src/goal/translate_pypy/httpserver.py   (contents, props changed)
   pypy/trunk/src/goal/translate_pypy/index.html
   pypy/trunk/src/goal/translate_pypy/translate_pypy.py
      - copied, changed from r5382, pypy/trunk/src/goal/translate_pypy.py
Removed:
   pypy/trunk/src/goal/translate_pypy.py
Modified:
   pypy/trunk/src/pypy/translator/tool/pygame/graphviewer.py
Log:
A quick HTTP hack to view the graphs and annotations computed by
translate_pypy.py.


Deleted: /pypy/trunk/src/goal/translate_pypy.py
==============================================================================
--- /pypy/trunk/src/goal/translate_pypy.py	Mon Jun 28 17:53:49 2004
+++ (empty file)
@@ -1,36 +0,0 @@
-#
-#  
-#
-
-import autopath
-
-from pypy.objspace.std.objspace import StdObjSpace, W_Object
-from pypy.objspace.std.intobject import W_IntObject
-from pypy.translator.translator import Translator
-
-
-# __________  Entry point  __________
-
-space = StdObjSpace()
-
-def entry_point():
-    w_a = W_IntObject(space, -6)
-    w_b = W_IntObject(space, -7)
-    return space.mul(w_a, w_b)
-
-
-# __________  Main  __________
-
-if __name__ == '__main__':
-    t = Translator(entry_point, verbose=True, simplifying=True)
-    try:
-        a = t.annotate([])
-        #a.simplify()
-    except:
-        import sys, traceback
-        exc, val, tb = sys.exc_info()
-        print >> sys.stderr
-        traceback.print_exception(exc, val, tb)
-        print >> sys.stderr
-        import pdb
-        pdb.post_mortem(tb)

Copied: pypy/trunk/src/goal/translate_pypy/autopath.py (from r5382, pypy/trunk/src/goal/autopath.py)
==============================================================================
--- pypy/trunk/src/goal/autopath.py	(original)
+++ pypy/trunk/src/goal/translate_pypy/autopath.py	Mon Jun 28 17:53:49 2004
@@ -1,2 +1,6 @@
 import sys, os
-sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
+sys.path.insert(0,
+    os.path.dirname(
+        os.path.dirname(
+            os.path.dirname(
+                os.path.abspath(__file__)))))

Added: pypy/trunk/src/goal/translate_pypy/func.html
==============================================================================
--- (empty file)
+++ pypy/trunk/src/goal/translate_pypy/func.html	Mon Jun 28 17:53:49 2004
@@ -0,0 +1,24 @@
+<HTML>
+<HEAD>
+</HEAD>
+<BODY>
+
+  <OBJECT data="%(img)s" type="image/png" usemap="#map1">
+     <MAP name="map1">
+       <P>Variables:
+%(
+for n, rect, text in zones:
+    print '<A href="var?n=%s" shape="rect"' % n
+    print 'coords="%d,%d,%d,%d"' % rect
+    s1 = htmlquote(text)
+    print 'title="%s"' % s1
+    s2 = repr(text)[1:-1].replace('"', '\\"').replace("'", "\\'")
+    print 'onmouseover="window.status=\'%s\'">' % s2
+    print s1
+    print '</A>'
+)s
+     </MAP>
+  </OBJECT>
+
+</BODY>
+</HTML>

Added: pypy/trunk/src/goal/translate_pypy/graphserver.py
==============================================================================
--- (empty file)
+++ pypy/trunk/src/goal/translate_pypy/graphserver.py	Mon Jun 28 17:53:49 2004
@@ -0,0 +1,78 @@
+import BaseHTTPServer
+from cStringIO import StringIO
+import httpserver
+from pypy.translator.tool.pygame.graphviewer import GraphViewer
+from pypy.translator.tool.make_dot import make_dot_graphs
+
+
+class Server:
+
+    def __init__(self, translator):
+        self.translator = translator
+        self.viewercache = {}
+        self.binding_by_name = {}
+        for var, s_value in self.translator.annotator.bindings.items():
+            self.binding_by_name[var.name] = '%s :  %r' % (var.name, s_value)
+
+    def getviewer(self, i):
+        t = self.translator
+        func = t.functions[i]
+        if func in self.viewercache:
+            return self.viewercache[func]
+        name = '%s_%d' % (func.__name__, i)
+        graph = t.getflowgraph(func)
+        graphs = [(graph.name, graph)]
+        xdotfile = str(make_dot_graphs(name, graphs, target='xdot'))
+        pngfile = str(make_dot_graphs(name, graphs, target='png'))
+        viewer = GraphViewer(xdotfile, pngfile)
+        zones = []
+        for (x,y,w,h), name in viewer.getzones():
+            if name in self.binding_by_name:
+                zones.append((name, (x,y,x+w,y+h), self.binding_by_name[name]))
+        result = zones, pngfile
+        self.viewercache[func] = result
+        return result
+
+    def indexloader(self, **options):
+        t = self.translator
+        return httpserver.load('index.html', 'text/html', {'t': t})
+
+    def funcloader(self, i, **options):
+        i = int(i[0])
+        zones, pngfile = self.getviewer(i)
+        t = self.translator
+        return httpserver.load('func.html', 'text/html',
+                               {'t': t,
+                                'zones': zones,
+                                'img': 'img?i=%d' % i,
+                                })
+
+    def imgloader(self, i, **options):
+        i = int(i[0])
+        zones, pngfile = self.getviewer(i)
+        return open(pngfile, 'rb'), 'image/png'
+
+    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'
+
+    def serve(self):
+        httpserver.register('', self.indexloader)
+        httpserver.register('func', self.funcloader)
+        httpserver.register('img', self.imgloader)
+        httpserver.register('var', self.varloader)
+        BaseHTTPServer.test(HandlerClass=httpserver.MiniHandler)
+
+# ____________________________________________________________
+
+if __name__ == '__main__':
+    from pypy.translator.translator import Translator
+    from pypy.translator.test import snippet
+    t = Translator(snippet.sieve_of_eratosthenes)
+    t.simplify()
+    a = t.annotate([])
+    a.simplify()
+    Server(t).serve()

Added: pypy/trunk/src/goal/translate_pypy/httpserver.py
==============================================================================
--- (empty file)
+++ pypy/trunk/src/goal/translate_pypy/httpserver.py	Mon Jun 28 17:53:49 2004
@@ -0,0 +1,175 @@
+from __future__ import generators
+from __future__ import nested_scopes
+import BaseHTTPServer
+from SimpleHTTPServer import SimpleHTTPRequestHandler
+import urlparse, cgi, htmlentitydefs
+import sys, os, time
+from cStringIO import StringIO
+
+
+class Translator:
+    """For use with format strings.
+    
+    'formatstring % translator' will evaluate all %(xxx)s expressions
+    found in the format string in the given globals/locals.
+
+    Multiline expressions are assumed to be one or several complete
+    statements; they are executed and whatever they print is inserted back
+    into the format string."""
+    
+    def __init__(self, globals, locals):
+        self.globals = globals
+        self.locals = locals
+    
+    def __getitem__(self, expr):
+        if '\n' in expr:
+            if not expr.endswith('\n'):
+                expr += '\n'
+            prevstdout = sys.stdout
+            try:
+                sys.stdout = f = StringIO()
+                exec expr in self.globals, self.locals
+            finally:
+                sys.stdout = prevstdout
+            return f.getvalue()
+        else:
+            return eval(expr, self.globals, self.locals)
+
+class TranslatorIO:
+    "Lazy version of Translator."
+    
+    def __init__(self, fmt, d):
+        self.gen = self.generate(fmt, d)
+        
+    def read(self, ignored=None):
+        for text in self.gen:
+            if text:
+                return text
+        return ''
+
+    def close(self):
+        self.gen = ()
+
+    def generate(self, fmt, d):
+        t = Translator(d, d)
+        for data in fmt.split('\x0c'):
+            yield data % t
+
+
+# HTML quoting
+
+text_to_html = {}
+for key, value in htmlentitydefs.entitydefs.items():
+    text_to_html[value] = '&' + key + ';'
+
+def htmlquote(s):
+    return ''.join([text_to_html.get(c, c) for c in s])
+
+
+# HTTP Request Handler
+
+pathloaders = {}
+
+def canonicalpath(url):
+    if url.startswith('/'):
+        url = url[1:]
+    return url.lower()
+
+def register(url, loader):
+    pathloaders[canonicalpath(url)] = loader
+
+def is_registered(url):
+    return canonicalpath(url) in pathloaders
+
+def load(filename, mimetype=None, locals=None):
+    if mimetype and mimetype.startswith('text/'):
+        mode = 'r'
+    else:
+        mode = 'rb'
+    f = open(filename, mode)
+    if locals is not None:
+        data = f.read()
+        f.close()
+        #data = data.replace('%"', '%%"')
+        d = globals().copy()
+        d.update(locals)
+        f = TranslatorIO(data, d)
+    return f, mimetype
+
+def fileloader(filename, mimetype=None):
+    def loader(**options):
+        return load(filename, mimetype)
+    return loader
+
+class HTTPRequestError(Exception):
+    pass
+
+class MiniHandler(SimpleHTTPRequestHandler):
+
+    def send_head(self, query=''):
+        addr, host, path, query1, fragment = urlparse.urlsplit(self.path)
+        path = canonicalpath(path)
+        if path not in pathloaders:
+            if path + '/' in pathloaders:
+                return self.redirect(path + '/')
+            self.send_error(404)
+            return None
+        kwds = {}
+        for q in [query1, query]:
+            if q:
+                kwds.update(cgi.parse_qs(q))
+        loader = pathloaders[path]
+        try:
+            hdr = self.headers
+            hdr['remote host'] = self.client_address[0]
+            f, ctype = loader(headers=hdr, **kwds)
+        except IOError, e:
+            self.send_error(404, "I/O error: " + str(e))
+            return None
+        except HTTPRequestError, e:
+            self.send_error(500, str(e))
+            return None
+        except:
+            f = StringIO()
+            import traceback
+            traceback.print_exc(file=f)
+            data = htmlquote(f.getvalue())
+            data = data.replace('\n', '<br>\n')
+            self.send_error(500)
+            return StringIO('<hr><p>'+data+'</p>')
+        if ctype is None:
+            ctype = self.guess_type(self.translate_path(self.path))
+        elif f is None:
+            return self.redirect(ctype)
+        
+        self.send_response(200)
+        self.send_header("Content-type", ctype)
+        self.end_headers()
+        return f
+
+    def redirect(self, url):
+        self.send_response(302)
+        self.send_header("Content-type", 'text/html')
+        self.send_header("Location", url)
+        self.end_headers()
+        return StringIO('''<html><head></head><body>
+Please <a href="%s">click here</a> to continue.
+</body></html>
+''' % url)
+
+    def do_POST(self):
+        try:
+            nbytes = int(self.headers.getheader('content-length'))
+        except:
+            nbytes = 0
+        query = self.rfile.read(nbytes).strip()
+        f = self.send_head(query)
+        if f:
+            self.copyfile(f, self.wfile)
+            f.close()
+
+
+def my_host():
+    import gamesrv
+    port = gamesrv.socketports[gamesrv.openhttpsocket()]
+    return '127.0.0.1:%d' % port

Added: pypy/trunk/src/goal/translate_pypy/index.html
==============================================================================
--- (empty file)
+++ pypy/trunk/src/goal/translate_pypy/index.html	Mon Jun 28 17:53:49 2004
@@ -0,0 +1,16 @@
+<html>
+<head><title>Functions</title></head>
+<body><h1>Functions</h1>
+<table CELLSPACING=1 CELLPADDING=1 BORDER=1>
+%(
+for i, func in zip(range(len(t.functions)), t.functions):
+    print "<tr><td>&nbsp;"
+    print "%s:%d" % (htmlquote(func.func_globals.get('__name__', '?')),
+                     func.func_code.co_firstlineno)
+    print "&nbsp;</td><td>&nbsp;<code><a href='func?i=%d'>" % i
+    print htmlquote(func.__name__)
+    print "</a></code>&nbsp;</td></tr>"
+)s
+</table>
+</body>
+</html>

Copied: pypy/trunk/src/goal/translate_pypy/translate_pypy.py (from r5382, pypy/trunk/src/goal/translate_pypy.py)
==============================================================================
--- pypy/trunk/src/goal/translate_pypy.py	(original)
+++ pypy/trunk/src/goal/translate_pypy/translate_pypy.py	Mon Jun 28 17:53:49 2004
@@ -1,7 +1,6 @@
 #
 #  
 #
-
 import autopath
 
 from pypy.objspace.std.objspace import StdObjSpace, W_Object
@@ -27,10 +26,14 @@
         a = t.annotate([])
         #a.simplify()
     except:
-        import sys, traceback
+        import sys, traceback, thread
         exc, val, tb = sys.exc_info()
         print >> sys.stderr
         traceback.print_exception(exc, val, tb)
         print >> sys.stderr
+        import graphserver
+        def bkgnd_server():
+            graphserver.Server(t).serve()
+        thread.start_new_thread(bkgnd_server, ())
         import pdb
         pdb.post_mortem(tb)

Modified: pypy/trunk/src/pypy/translator/tool/pygame/graphviewer.py
==============================================================================
--- pypy/trunk/src/pypy/translator/tool/pygame/graphviewer.py	(original)
+++ pypy/trunk/src/pypy/translator/tool/pygame/graphviewer.py	Mon Jun 28 17:53:49 2004
@@ -1,3 +1,4 @@
+from __future__ import generators
 import autopath
 import sys, os, re
 import pygame
@@ -91,6 +92,20 @@
                 return word, text, name
         return None, None, None
 
+    def getzones(self, re_nonword=re.compile(r'(\W+)')):
+        for (rx,ry,rw,rh), originalw, text, name in self.positions:
+            words = [s for s in re_nonword.split(text) if s]
+            segment = ''
+            dx1 = 0
+            for word in words:
+                segment += word
+                img = self.font.render(segment, 1, (255, 0, 0))
+                w, h = img.get_size()
+                dx2 = int(float(w) * originalw / rw)
+                if word.strip():
+                    yield (rx+dx1, ry, dx2-dx1, rh), word
+                dx1 = dx2
+
     def parse_xdot_output(self, lines):
         for i in range(len(lines)):
             if lines[i].endswith('\\\n'):



More information about the Pypy-commit mailing list