Author: Stephan <[email protected]>
Branch: 
Changeset: r277:1a0f79234a31
Date: 2012-08-04 15:18 +0200
http://bitbucket.org/pypy/lang-js/changeset/1a0f79234a31/

Log:    try to compile interpreter to run ecma tests in

diff --git a/js/test/ecma/conftest.py b/js/test/ecma/conftest.py
--- a/js/test/ecma/conftest.py
+++ b/js/test/ecma/conftest.py
@@ -1,14 +1,12 @@
 import pytest
 import py
 
+from js.interpreter import Interpreter
 from _pytest.runner import Failed
-from js.interpreter import Interpreter, load_file
 from js.jsobj import _w
-from js import interpreter
 from js.execution import JsException
 from pypy.rlib.parsing.parsing import ParseError
 
-
 EXCLUSIONLIST = ['shell.js', 'browser.js']
 SKIP = [\
     '7.2-1.0',
@@ -151,8 +149,57 @@
            action="store_true", dest="ecma", default=False,
            help="run js interpreter ecma tests"
     )
+    parser.addoption('--ecma-compile',
+           action="store_true", dest="ecma-compile", default=False,
+           help="run js interpreter ecma tests"
+    )
 
 rootdir = py.path.local(__file__).dirpath()
+shellpath = rootdir/'shell.js'
+_compiled_f = None
+
+class InterpreterResults(object):
+    compiled_interpreter = None
+
+    def __init__(self, do_compile):
+        self.do_compile = do_compile
+
+    def get_interp(self):
+        def f(testfile):
+            interp = Interpreter({'no-exception-jseval':True})
+
+            interp.run_file(str(shellpath))
+            interp.run_file(testfile)
+
+            global_object = interp.global_object
+            testcases = global_object.get(u'testcases')
+
+            testcount = testcases.get(u'length').ToInt32()
+
+            run_test_func = global_object.get(u'run_test')
+
+            test_results = []
+
+            for number in xrange(testcount):
+                w_test_number = _w(number)
+                result_obj = run_test_func.Call(args = [w_test_number])
+                result_passed = result_obj.get(u'passed').to_boolean()
+                result_reason = str(result_obj.get(u'reason').to_string())
+                test_results.append({'number': number, 'passed':result_passed, 
'reason':result_reason})
+
+            return test_results
+
+        if self.do_compile:
+            if self.compiled_interpreter is None:
+                from pypy.translator.c.test.test_genc import compile
+                self.compiled_interpreter = compile(f, [str])
+            return self.compiled_interpreter
+        else:
+            return f
+
+    def get_results(self, test_file):
+        interp = self.get_interp()
+        return interp(test_file)
 
 class JSTestFile(pytest.File):
     def __init__(self, fspath, parent=None, config=None, session=None):
@@ -166,53 +213,21 @@
         if self.name in SKIP:
             pytest.skip()
 
-        interp = Interpreter()
+        do_compile = self.session.config.getvalue("ecma-compile")
+        interp = InterpreterResults(do_compile)
 
-        # the tests expect eval to return "error" on an exception
-        from js.builtins import put_intimate_function
-        def overriden_eval(ctx):
-            from js.builtins_global import js_eval
-            from js.execution import JsException
-            from js.completion import NormalCompletion
-            try:
-                return js_eval(ctx)
-            except JsException:
-                return NormalCompletion(value = _w("error"))
-
-        global_object = interp.global_object
-        del(global_object._properties_[u'eval'])
-        put_intimate_function(global_object, u'eval', overriden_eval, 
configurable = False, params = [u'x'])
-
-        shellpath = rootdir/'shell.js'
-        shellfile = load_file(str(shellpath))
-        interp.run_ast(shellfile)
-
-        #actually run the file :)
-        t = load_file(str(self.fspath))
         try:
-            interp.run_ast(t)
+            results = interp.get_results(str(self.fspath))
         except ParseError, e:
             raise Failed(msg=e.nice_error_message(filename=str(self.fspath))) 
#, excinfo=None)
-        #except JsException, e:
-            #import pdb; pdb.set_trace()
-            #raise Failed(msg="Javascript Error: "+str(e)) #, 
excinfo=py.code.ExceptionInfo())
+        except JsException, e:
+            import pdb; pdb.set_trace()
+            raise Failed(msg="Javascript Error: "+str(e)) #, 
excinfo=py.code.ExceptionInfo())
 
-        testcases = global_object.get(u'testcases')
-        #tc = global_object.get('tc')
-        #self.tc = tc
-        testcount = testcases.get(u'length').ToInt32()
-        self.testcases = testcases
-
-        run_test_func = global_object.get(u'run_test')
-        def get_result(test_num):
-            w_test_number = _w(test_num)
-            result_obj = run_test_func.Call(args = [w_test_number])
-            result_passed = result_obj.get(u'passed').to_boolean()
-            result_reason = result_obj.get(u'reason').to_string();
-            return (result_passed, result_reason) # result.to_string()
-
-        for number in xrange(testcount):
-            passed, reason = get_result(number)
+        for test_result in results:
+            number = test_result.get('number')
+            passed = test_result.get('passed')
+            reason = test_result.get('reason')
             yield JSTestItem(str(number), passed, reason, parent=self)
 
 class JSTestItem(pytest.Item):
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to