[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> "
+ print "%s:%d" % (htmlquote(func.func_globals.get('__name__', '?')),
+ func.func_code.co_firstlineno)
+ print " </td><td> <code><a href='func?i=%d'>" % i
+ print htmlquote(func.__name__)
+ print "</a></code> </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