[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