[pypy-svn] r4900 - in pypy/branch/src-newobjectmodel/pypy: interpreter tool
mwh at codespeak.net
mwh at codespeak.net
Fri Jun 4 14:15:53 CEST 2004
Author: mwh
Date: Fri Jun 4 14:15:52 2004
New Revision: 4900
Added:
pypy/branch/src-newobjectmodel/pypy/tool/tb_server.py
Modified:
pypy/branch/src-newobjectmodel/pypy/interpreter/error.py
pypy/branch/src-newobjectmodel/pypy/interpreter/py.py
pypy/branch/src-newobjectmodel/pypy/tool/option.py
Log:
Beginnings of the debugging web server.
Modified: pypy/branch/src-newobjectmodel/pypy/interpreter/error.py
==============================================================================
--- pypy/branch/src-newobjectmodel/pypy/interpreter/error.py (original)
+++ pypy/branch/src-newobjectmodel/pypy/interpreter/error.py Fri Jun 4 14:15:52 2004
@@ -95,6 +95,8 @@
interpr_file = LinePrefixer(file, '||')
print >> interpr_file, "Traceback (interpreter-level):"
traceback.print_tb(self.debug_tbs[i], file=interpr_file)
+ from pypy.tool import tb_server
+ tb_server.publish_tb(self.debug_tbs[0])
self.print_app_tb_only(file)
if space is None:
exc_typename = str(self.w_type)
Modified: pypy/branch/src-newobjectmodel/pypy/interpreter/py.py
==============================================================================
--- pypy/branch/src-newobjectmodel/pypy/interpreter/py.py (original)
+++ pypy/branch/src-newobjectmodel/pypy/interpreter/py.py Fri Jun 4 14:15:52 2004
@@ -32,33 +32,42 @@
return options
def main_(argv=None):
+ from pypy.tool import tb_server
args = option.process_options(get_main_options(), Options, argv[1:])
- space = option.objspace()
- go_interactive = Options.interactive
- banner = ''
- if Options.command:
- args = ['-c']
- for arg in args:
- space.call_method(space.sys.w_argv, 'append', space.wrap(arg))
- if Options.command:
- try:
- main.run_string(Options.command[0], '<string>', space)
- except error.PyPyError, pypyerr:
- pypyerr.operationerr.print_detailed_traceback(pypyerr.space)
- elif args:
- try:
- main.run_file(args[0], space)
- except error.PyPyError, pypyerr:
- pypyerr.operationerr.print_detailed_traceback(pypyerr.space)
- else:
- go_interactive = 1
- banner = None
- if go_interactive:
- con = interactive.PyPyConsole(space)
- if banner == '':
- banner = '%s / %s'%(con.__class__.__name__,
- space.__class__.__name__)
- con.interact(banner)
+ print 'options processed'
+ try:
+ space = option.objspace()
+ go_interactive = Options.interactive
+ banner = ''
+ if Options.command:
+ args = ['-c']
+ for arg in args:
+ space.call_method(space.sys.w_argv, 'append', space.wrap(arg))
+ if Options.command:
+ try:
+ main.run_string(Options.command[0], '<string>', space)
+ except error.PyPyError, pypyerr:
+ pypyerr.operationerr.print_detailed_traceback(pypyerr.space)
+ elif args:
+ try:
+ main.run_file(args[0], space)
+ except error.PyPyError, pypyerr:
+ pypyerr.operationerr.print_detailed_traceback(pypyerr.space)
+ else:
+ go_interactive = 1
+ banner = None
+ if go_interactive:
+ con = interactive.PyPyConsole(space)
+ if banner == '':
+ banner = '%s / %s'%(con.__class__.__name__,
+ space.__class__.__name__)
+ con.interact(banner)
+ except:
+ sys.excepthook(*sys.exc_info())
+ print 'waiting'
+ tb_server.wait_until_interrupt()
+
+ tb_server.stop()
if __name__ == '__main__':
try:
Modified: pypy/branch/src-newobjectmodel/pypy/tool/option.py
==============================================================================
--- pypy/branch/src-newobjectmodel/pypy/tool/option.py (original)
+++ pypy/branch/src-newobjectmodel/pypy/tool/option.py Fri Jun 4 14:15:52 2004
@@ -5,7 +5,11 @@
class Options:
verbose = 0
showwarning = 0
- spaces = []
+ spaces = []
+
+def run_tb_server(option, opt, value, parser):
+ from pypy.tool import tb_server
+ tb_server.start()
def get_standard_options():
options = []
@@ -35,6 +39,11 @@
options.append(make_option(
'-w', action="store_true", dest="showwarning",
help="enable warnings (disabled by default)"))
+ options.append(make_option(
+ '-H', action="callback",
+ callback=run_tb_server,
+ help="use web browser for traceback info"))
+
return options
Added: pypy/branch/src-newobjectmodel/pypy/tool/tb_server.py
==============================================================================
--- (empty file)
+++ pypy/branch/src-newobjectmodel/pypy/tool/tb_server.py Fri Jun 4 14:15:52 2004
@@ -0,0 +1,78 @@
+from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
+import threading
+import sys
+
+global content
+content = ''
+server_thread = None
+
+class TBRequestHandler(BaseHTTPRequestHandler):
+ def do_GET(self):
+ if self.path == '/quit':
+ global server_thread
+ server_thread = None
+ raise SystemExit
+ self.send_response(200)
+ self.send_header("Content-Type", "text/plain")
+ self.end_headers()
+ self.wfile.write(content)
+
+ def log_message(self, format, *args):
+ pass
+
+class TBServer(HTTPServer):
+ def handle_error(self, request, client_address):
+ exc = sys.exc_info()[1]
+ if isinstance(exc, (SystemExit, KeyboardInterrupt)):
+ raise
+ else:
+ HTTPServer.handle_error(self, request, client_address)
+
+def serve():
+ port = 8080
+ while 1:
+ try:
+ server = TBServer(('localhost', port), TBRequestHandler)
+ except socket.error:
+ port += 1
+ continue
+ else:
+ break
+ global server_port
+ server_port = port
+ print "serving on", port
+ server.serve_forever()
+
+def start():
+ global server_thread
+ server_thread = threading.Thread(target=serve)
+ server_thread.start()
+ return server_thread
+
+def stop():
+ if server_thread is None:
+ return
+ import urllib2
+ try:
+ urllib2.urlopen('http://localhost:%s/quit'%(server_port,))
+ except urllib2.HTTPError:
+ pass
+
+def wait_until_interrupt():
+ if server_thread is None:
+ return
+ import signal
+ try:
+ signal.pause()
+ except KeyboardInterrupt:
+ stop()
+
+def publish_tb(tb):
+ import traceback
+ s = traceback.format_tb(tb)
+ global content
+ content = ''.join(s)
+
+if __name__ == "__main__":
+ t = main()
+ wait_until_interrupt()
More information about the Pypy-commit
mailing list