Author: Ronny Pfannschmidt <[email protected]>
Branch:
Changeset: r186:34292f6ef484
Date: 2012-01-27 11:47 +0100
http://bitbucket.org/pypy/jitviewer/changeset/34292f6ef484/
Log: shuffle around app code, so we have templates+static in the package
diff --git a/bin/jitviewer.py b/_jitviewer/app.py
copy from bin/jitviewer.py
copy to _jitviewer/app.py
--- a/bin/jitviewer.py
+++ b/_jitviewer/app.py
@@ -152,10 +152,8 @@
class OverrideFlask(flask.Flask):
- root_path = property(lambda self: self._root_path, lambda *args: None)
def __init__(self, *args, **kwargs):
- self._root_path = kwargs.pop('root_path')
self.servers = []
self.evil_monkeypatch()
flask.Flask.__init__(self, *args, **kwargs)
@@ -172,7 +170,6 @@
BaseServer.__init__ = __init__
def main():
- PATH = os.path.dirname(os.path.dirname((_jitviewer.__file__)))
if not '__pypy__' in sys.builtin_module_names:
print "Please run it using pypy-c"
sys.exit(1)
@@ -195,7 +192,7 @@
log, loops = import_log(filename, ParserWithHtmlRepr)
parse_log_counts(extract_category(log, 'jit-backend-count'), loops)
storage.reconnect_loops(loops)
- app = OverrideFlask('jitviewer', root_path=PATH)
+ app = OverrideFlask('_jitviewer')
server = Server(filename, storage)
app.debug = True
app.route('/')(server.index)
diff --git a/static/DroidSansMono.ttf b/_jitviewer/static/DroidSansMono.ttf
rename from static/DroidSansMono.ttf
rename to _jitviewer/static/DroidSansMono.ttf
diff --git a/static/jquery-1.2.6.min.js b/_jitviewer/static/jquery-1.2.6.min.js
rename from static/jquery-1.2.6.min.js
rename to _jitviewer/static/jquery-1.2.6.min.js
diff --git a/static/jquery.min.js b/_jitviewer/static/jquery.min.js
rename from static/jquery.min.js
rename to _jitviewer/static/jquery.min.js
diff --git a/static/jquery.scrollTo-1.4.1.js
b/_jitviewer/static/jquery.scrollTo-1.4.1.js
rename from static/jquery.scrollTo-1.4.1.js
rename to _jitviewer/static/jquery.scrollTo-1.4.1.js
diff --git a/static/jquery.scrollTo-1.4.2-min.js
b/_jitviewer/static/jquery.scrollTo-1.4.2-min.js
rename from static/jquery.scrollTo-1.4.2-min.js
rename to _jitviewer/static/jquery.scrollTo-1.4.2-min.js
diff --git a/static/loop.js b/_jitviewer/static/loop.js
rename from static/loop.js
rename to _jitviewer/static/loop.js
diff --git a/static/pygments.css b/_jitviewer/static/pygments.css
rename from static/pygments.css
rename to _jitviewer/static/pygments.css
diff --git a/static/qt_workaround.css b/_jitviewer/static/qt_workaround.css
rename from static/qt_workaround.css
rename to _jitviewer/static/qt_workaround.css
diff --git a/static/script.js b/_jitviewer/static/script.js
rename from static/script.js
rename to _jitviewer/static/script.js
diff --git a/static/style.css b/_jitviewer/static/style.css
rename from static/style.css
rename to _jitviewer/static/style.css
diff --git a/templates/index.html b/_jitviewer/templates/index.html
rename from templates/index.html
rename to _jitviewer/templates/index.html
diff --git a/templates/loop.html b/_jitviewer/templates/loop.html
rename from templates/loop.html
rename to _jitviewer/templates/loop.html
diff --git a/bin/jitviewer.py b/bin/jitviewer.py
old mode 100755
new mode 100644
--- a/bin/jitviewer.py
+++ b/bin/jitviewer.py
@@ -1,241 +1,3 @@
#!/usr/bin/env pypy
-""" A web-based browser of your log files. Run by
-
- jitviewer.py <path to your log file> [port] [--qt]
-
-By default the script will run a web server, point your browser to
-http://localhost:5000
-
-If you pass --qt, this script will also start a lightweight PyQT/QWebKit based
-browser pointing at the jitviewer. This assumes that CPython is installed in
-/usr/bin/python, and that PyQT with WebKit support is installed.
-
-Demo logfile available in this directory as 'log'.
-
-To produce the logfile for your program, run:
-
- PYPYLOG=jit-log-opt,jit-backend-counts:mylogfile.log pypy myapp.py
-"""
-
-import sys
-import os.path
-
-try:
- import _jitviewer
-except ImportError:
- sys.path.insert(0, os.path.abspath(os.path.join(__file__, '..', '..')))
-
-try:
- import pypy
-except ImportError:
- import __pypy__
- sys.path.append(os.path.join(__pypy__.__file__, '..', '..', '..'))
- try:
- import pypy
- except ImportError:
- raise ImportError('Could not import pypy module, make sure to '
- 'add the pypy module to PYTHONPATH')
-
-import jinja2
-if jinja2.__version__ < '2.6':
- raise ImportError("Required jinja version is 2.6 (the git tip), older
versions might segfault PyPy")
-
-import flask
-import inspect
-import threading
-import time
-from pypy.tool.logparser import extract_category
-from pypy.tool.jitlogparser.storage import LoopStorage
-from pypy.tool.jitlogparser.parser import adjust_bridges, import_log,\
- parse_log_counts
-#
-from _jitviewer.parser import ParserWithHtmlRepr, FunctionHtml
-from _jitviewer.display import CodeRepr, CodeReprNoFile
-import _jitviewer
-
-CUTOFF = 30
-
-class CannotFindFile(Exception):
- pass
-
-class DummyFunc(object):
- def repr(self):
- return '???'
-
-class Server(object):
- def __init__(self, filename, storage):
- self.filename = filename
- self.storage = storage
-
- def index(self):
- all = flask.request.args.get('all', None)
- loops = []
- for index, loop in enumerate(self.storage.loops):
- is_entry = False
- try:
- start, stop = loop.comment.find('('), loop.comment.rfind(')')
- name = loop.comment[start + 1:stop]
- func = FunctionHtml.from_operations(loop.operations,
self.storage,
- limit=1,
- inputargs=loop.inputargs,
- loopname=name)
- except CannotFindFile:
- func = DummyFunc()
- func.count = getattr(loop, 'count', '?')
- loops.append((is_entry, index, func))
- loops.sort(lambda a, b: cmp(b[2].count, a[2].count))
- if len(loops) > CUTOFF:
- extra_data = "Show all (%d) loops" % len(loops)
- else:
- extra_data = ""
- if not all:
- loops = loops[:CUTOFF]
-
- qt_workaround = ('Qt/4.7.2' in flask.request.user_agent.string)
- return flask.render_template('index.html', loops=loops,
- filename=self.filename,
- qt_workaround=qt_workaround,
- extra_data=extra_data)
-
- def loop(self):
- no = int(flask.request.args.get('no', '0'))
- orig_loop = self.storage.loops[no]
- if hasattr(orig_loop, 'force_asm'):
- orig_loop.force_asm()
- ops = adjust_bridges(orig_loop, flask.request.args)
- loop = FunctionHtml.from_operations(ops, self.storage,
- inputargs=orig_loop.inputargs)
- path = flask.request.args.get('path', '').split(',')
- if path:
- up = '"' + ','.join(path[:-1]) + '"'
- else:
- up = '""'
- callstack = []
- path_so_far = []
- for e in path:
- if e:
- callstack.append((','.join(path_so_far),
- '%s in %s at %d' % (loop.name,
- loop.filename,
- loop.startlineno)))
- loop = loop.chunks[int(e)]
- path_so_far.append(e)
- callstack.append((','.join(path_so_far), '%s in %s at %d' % (loop.name,
- loop.filename, loop.startlineno)))
-
- if not loop.has_valid_code() or loop.filename is None:
- startline = 0
- source = CodeReprNoFile(loop)
- else:
- startline, endline = loop.linerange
- code = self.storage.load_code(loop.filename)[(loop.startlineno,
- loop.name)]
- if code.co_name == '<module>' and code.co_firstlineno == 1:
- try:
- with open(code.co_filename) as f:
- source = CodeRepr(f.read(), code, loop)
- except (IOError, OSError):
- source = CodeReprNoFile(loop)
- else:
- #try:
- source = CodeRepr(inspect.getsource(code), code, loop)
- #except:
- # source = CodeReprNoFile(loop)
- d = {'html': flask.render_template('loop.html',
- source=source,
- current_loop=no,
- upper_path=up,
- show_upper_path=bool(path)),
- 'scrollto': startline,
- 'callstack': callstack}
- return flask.jsonify(d)
-
-
-class OverrideFlask(flask.Flask):
- root_path = property(lambda self: self._root_path, lambda *args: None)
-
- def __init__(self, *args, **kwargs):
- self._root_path = kwargs.pop('root_path')
- self.servers = []
- self.evil_monkeypatch()
- flask.Flask.__init__(self, *args, **kwargs)
-
- def evil_monkeypatch(self):
- """
- Evil way to fish the server started by flask, necessary to be able to
shut
- it down cleanly."""
- from SocketServer import BaseServer
- orig___init__ = BaseServer.__init__
- def __init__(self2, *args, **kwds):
- self.servers.append(self2)
- orig___init__(self2, *args, **kwds)
- BaseServer.__init__ = __init__
-
-def main():
- PATH = os.path.dirname(os.path.dirname((_jitviewer.__file__)))
- if not '__pypy__' in sys.builtin_module_names:
- print "Please run it using pypy-c"
- sys.exit(1)
- #
- server_mode = True
- if '--qt' in sys.argv:
- server_mode = False
- sys.argv.remove('--qt')
- #
- if len(sys.argv) != 2 and len(sys.argv) != 3:
- print __doc__
- sys.exit(1)
- filename = sys.argv[1]
- extra_path = os.path.dirname(filename)
- if len(sys.argv) != 3:
- port = 5000
- else:
- port = int(sys.argv[2])
- storage = LoopStorage(extra_path)
- log, loops = import_log(filename, ParserWithHtmlRepr)
- parse_log_counts(extract_category(log, 'jit-backend-count'), loops)
- storage.reconnect_loops(loops)
- app = OverrideFlask('jitviewer', root_path=PATH)
- server = Server(filename, storage)
- app.debug = True
- app.route('/')(server.index)
- app.route('/loop')(server.loop)
- def run():
- app.run(use_reloader=False, host='0.0.0.0', port=port)
-
- if server_mode:
- run()
- else:
- url = "http://localhost:%d/" % port
- run_server_and_browser(app, run, url, filename)
-
-def run_server_and_browser(app, run, url, filename):
- try:
- # start the HTTP server in another thread
- th = threading.Thread(target=run)
- th.start()
- #
- # start the webkit browser in the main thread (actually, it's a
subprocess)
- time.sleep(0.5) # give the server some time to start
- start_browser(url, filename)
- finally:
- # shutdown the HTPP server and wait until it completes
- app.servers[0].shutdown()
- th.join()
-
-def start_browser(url, filename):
- import subprocess
- qwebview_py = os.path.join(os.path.dirname(__file__), 'qwebview.py')
- title = "jitviewer: " + filename
- try:
- return subprocess.check_call(['/usr/bin/python', qwebview_py, url,
title])
- except Exception, e:
- print 'Cannot start the builtin browser: %s' % e
- print "Please point your browser to: %s" % url
- try:
- raw_input("Press enter to quit and kill the server")
- except KeyboardInterrupt:
- pass
-
-if __name__ == '__main__':
- main()
+from _jitviewer.app import main
+main()
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit