[pypy-svn] r65125 - pypy/branch/js-refactoring/pypy/lang/js

jandem at codespeak.net jandem at codespeak.net
Thu May 7 11:38:45 CEST 2009


Author: jandem
Date: Thu May  7 11:38:42 2009
New Revision: 65125

Modified:
   pypy/branch/js-refactoring/pypy/lang/js/console.py
Log:
JS console: show traceback/exception, add load() and quit()


Modified: pypy/branch/js-refactoring/pypy/lang/js/console.py
==============================================================================
--- pypy/branch/js-refactoring/pypy/lang/js/console.py	(original)
+++ pypy/branch/js-refactoring/pypy/lang/js/console.py	Thu May  7 11:38:42 2009
@@ -4,13 +4,12 @@
 import os, sys
 from pypy.lang.js.interpreter import load_source, Interpreter, load_file
 from pypy.lang.js.jsparser import parse, ParseError
-from pypy.lang.js.jsobj import W_Builtin, W_String, ThrowException, w_Undefined
+from pypy.lang.js.jsobj import W_NewBuiltin, W_String, ThrowException, w_Undefined
 from pypy.rlib.streamio import open_file_as_stream
 
 def printmessage(msg):
-    if msg is None:
-        return
-    os.write(1, msg)
+    if msg is not None:
+        os.write(1, msg)
 
 def readline():
     result = []
@@ -19,19 +18,46 @@
         result.append(s)
         if s == '\n':
             break
-       
+        
         if s == '':
             if len(result) > 1:
                 break
             raise SystemExit
     return ''.join(result)
 
+class W_Quit(W_NewBuiltin):
+    def Call(self, ctx, args=[], this=None):
+        raise SystemExit, 0
+
+class W_Load(W_NewBuiltin):
+    def __init__(self, ctx, interpreter):
+        W_NewBuiltin.__init__(self, ctx)
+        self.interpreter = interpreter
+    
+    def Call(self, ctx, args=[], this=None):
+        if len(args) >= 1:
+            filename = args[0].ToString(self.interpreter.global_context)
+            try:
+                assert filename is not None
+                program = load_file(filename)
+            except EnvironmentError, e:
+                msg = W_String("Can't open %s: %s" % (filename, e))
+                raise ThrowException(msg)
+            self.interpreter.run(program)
+        return w_Undefined
+
 class JSConsole(object):
     prompt_ok = 'js> '
     prompt_more = '... '
 
     def __init__(self):
-        self.interpreter = Interpreter()
+        interp = Interpreter()
+        ctx = interp.global_context
+        
+        interp.w_Global.Put(ctx, 'quit', W_Quit(ctx))
+        interp.w_Global.Put(ctx, 'load', W_Load(ctx, interp))
+        
+        self.interpreter = interp
     
     def runsource(self, source, filename='<input>'):
         try:
@@ -65,16 +91,24 @@
                 printmessage('\n')
         except SystemExit:
             raise
-        #except ThrowException, exc:
-        #    self.showtraceback(exc)
+        except ThrowException, exc:
+            self.showtraceback(exc)
+    
+    def showtraceback(self, exc):
+        printmessage(exc.exception.ToString(self.interpreter.global_context))
+        printmessage('\n')
     
     def showsyntaxerror(self, filename, exc):
-        pass
+        printmessage(' ' * 4 + \
+                  ' ' * exc.source_pos.columnno + \
+                  '^\n')
+        printmessage('Syntax Error\n')
     
     def interact(self):
         printmessage('PyPy JavaScript Interpreter\n')
         printmessage(self.prompt_ok)
         
+        # input for the current statement
         lines = []
         
         while True:



More information about the Pypy-commit mailing list