[pypy-svn] r31975 - in pypy/dist/pypy/translator: js/test transformer

fijal at codespeak.net fijal at codespeak.net
Mon Sep 4 08:56:41 CEST 2006


Author: fijal
Date: Mon Sep  4 08:56:18 2006
New Revision: 31975

Modified:
   pypy/dist/pypy/translator/js/test/runtest.py
   pypy/dist/pypy/translator/js/test/test_seq.py
   pypy/dist/pypy/translator/js/test/test_transformer.py
   pypy/dist/pypy/translator/transformer/debug.py
Log:
Added some tests for transformation.


Modified: pypy/dist/pypy/translator/js/test/runtest.py
==============================================================================
--- pypy/dist/pypy/translator/js/test/runtest.py	(original)
+++ pypy/dist/pypy/translator/js/test/runtest.py	Mon Sep  4 08:56:18 2006
@@ -28,7 +28,7 @@
     return True
 
 class compile_function(object):
-    def __init__(self, functions, annotations, stackless=False, view=False, html=None, is_interactive=False, root = None, run_browser = True, debug_transform = False):
+    def __init__(self, function, annotations, stackless=False, view=False, html=None, is_interactive=False, root = None, run_browser = True, debug_transform = False):
         if not use_browsertest and not _CLI_is_on_path():
             py.test.skip('Javascript CLI (js) not found')
 
@@ -36,7 +36,7 @@
         self.is_interactive = is_interactive
         t = TranslationContext()
         ann = t.buildannotator()
-        ann.build_types(functions, annotations)
+        ann.build_types(function, annotations)
         if debug_transform:
             DebugTransformer(t).transform_all()
         t.buildrtyper(type_system="ootype").specialize()
@@ -46,7 +46,7 @@
         if view or option.view:
             t.view()
         #self.js = JS(t, [function, callback_function], stackless)
-        self.js = JS(t, functions, stackless)
+        self.js = JS(t, function, stackless)
         self.js.write_source()
         if root is None and use_tg:
             from pypy.translator.js.demo.jsdemo.controllers import Root

Modified: pypy/dist/pypy/translator/js/test/test_seq.py
==============================================================================
--- pypy/dist/pypy/translator/js/test/test_seq.py	(original)
+++ pypy/dist/pypy/translator/js/test/test_seq.py	Mon Sep  4 08:56:18 2006
@@ -112,3 +112,15 @@
         
         fn = compile_function(upperlower, [])
         assert fn() == "ABAFabaf"
+
+def test_simple_seq():
+    def fun(i):
+        if i:
+            a = [("ab", "cd"), ("ef", "xy")]
+        else:
+            a = [("xz", "pr"), ("as", "fg")]
+        return ",".join(["%s : %s" % (i, j) for i,j in a])
+    
+    fn = compile_function(fun, [int])
+    assert fn(0) == fun(0)
+    assert fn(1) == fun(1)

Modified: pypy/dist/pypy/translator/js/test/test_transformer.py
==============================================================================
--- pypy/dist/pypy/translator/js/test/test_transformer.py	(original)
+++ pypy/dist/pypy/translator/js/test/test_transformer.py	Mon Sep  4 08:56:18 2006
@@ -6,6 +6,15 @@
 from pypy.translator.js.test.runtest import compile_function
 from pypy.translator.transformer.debug import traceback_handler
 
+def check_tb(tb_entry_str, callname, args, func, relline):
+    tb_entry = tb_entry_str.split(":")
+    funname, callargs, filename, lineno = tb_entry
+    assert funname == callname
+    if args is not None:
+        assert callargs.startswith(args)
+    assert filename == __file__ or filename == __file__[:-1]
+    assert int(lineno) == func.func_code.co_firstlineno + relline
+
 def test_simple_tansform():
     def g():
         raise ValueError()
@@ -16,27 +25,64 @@
     def wrapper():
         try:
             # XXX: this is needed to make annotator happy
-            traceback_handler.enter("entrypoint", "data")
+            traceback_handler.enter("entrypoint", "()", "", 0)
             f()
         except:
-            return "|".join([i + ": " + j for i, j in traceback_handler.tb])
+            return "|".join(["%s:%s:%s:%s" % k for k in traceback_handler.tb])
         return ""
     
     fn = compile_function(wrapper, [], debug_transform = True)
     retval = fn()
     lst = retval.split('|')
     assert len(lst) == 3
-    assert lst[1] == 'f: ()'
-    assert lst[2] == 'g: ()'
+    check_tb(lst[1], 'f', '()', wrapper, 4)
+    check_tb(lst[2], 'g', '()', f, 1)
 
-def test_simple_seq():
-    def fun(i):
-        if i:
-            a = [("ab", "cd"), ("ef", "xy")]
-        else:
-            a = [("xz", "pr"), ("as", "fg")]
-        return ",".join(["%s : %s" % (i, j) for i,j in a])
-    
-    fn = compile_function(fun, [int])
-    assert fn(0) == fun(0)
-    assert fn(1) == fun(1)
+def test_sophisticated_transform():
+    def g():
+        raise ValueError()
+    
+    def f():
+        try:
+            g()
+        except:
+            pass
+    
+    def z():
+        f()
+        raise TypeError()
+    
+    def wrapper():
+        try:
+            traceback_handler.enter("entrypoint", "()", "", 0)
+            z()
+        except:
+            return "|".join(["%s:%s:%s:%s" % k for k in traceback_handler.tb])
+        return ""
+    
+    fn = compile_function(wrapper, [], debug_transform = True)
+    retval = fn()
+    lst = retval.split("|")
+    assert len(lst) == 2
+    check_tb(lst[1], 'z', '()', wrapper, 3)
+
+def test_args():
+    def f(a, b, c):
+        raise TypeError()
+    
+    def g():
+        f(3, "dupa", [1,2,3])
+    
+    def wrapper():
+        try:
+            traceback_handler.enter("entrypoint", "()", "", 0)
+            g()
+        except:
+            return "|".join(["%s:%s:%s:%s" % k for k in traceback_handler.tb])
+        return ""
+    
+    fn = compile_function(wrapper, [], debug_transform = True)
+    retval = fn()
+    lst = retval.split("|")
+    check_tb(lst[1], "g", "()", wrapper, 3)
+    check_tb(lst[2], "f", "(3, 'dupa'", g, 1)

Modified: pypy/dist/pypy/translator/transformer/debug.py
==============================================================================
--- pypy/dist/pypy/translator/transformer/debug.py	(original)
+++ pypy/dist/pypy/translator/transformer/debug.py	Mon Sep  4 08:56:18 2006
@@ -10,6 +10,7 @@
 from pypy.rpython.ootypesystem import ootype
 from pypy.rpython.ootypesystem import rclass
 from pypy.translator.transformer.basictransform import BasicTransformer
+from pypy.interpreter.pytraceback import offset2lineno
 
 from types import FunctionType, MethodType
 
@@ -19,8 +20,8 @@
     def __init__(self):
         self.tb = []
     
-    def enter(self, tb_str, data):
-        self.tb.append((tb_str, data))
+    def enter(self, tb_str, data, filename, lineno):
+        self.tb.append((tb_str, data, filename, lineno))
     
     def leave(self, tb_str):
         num = len(self.tb) - 1
@@ -46,7 +47,7 @@
     def register_helpers(self):
         return None
         for func_name, func_args in [("traceback", []), 
-                ("enter", ["aa", "aa"]), ("leave", ["aa"])]:
+                ("enter", ["aa", "aa", "aa", 3]), ("leave", ["aa"])]:
             graph = self.flow_method(TracebackHandler, func_name, func_args)
             graph.explicit_traceback = True
     
@@ -62,8 +63,9 @@
                 # XXX or any other call
                 opg, v1 = self.genop("getattr", [self.instance_const, 'enter'])
                 fun_name = op.args[0].value.func_name
-                data = self.get_info(block, graph, op)
-                opc, v2 = self.genop("simple_call", [v1, fun_name, data])
+                data, filename, lineno = self.get_info(block, graph, op)
+                opc, v2 = self.genop("simple_call", [v1, fun_name, data, \
+                    filename, lineno])
                 opgl, v3 = self.genop("getattr", [self.instance_const, 'leave'])
                 oplc, v4 = self.genop("simple_call", [v3, fun_name])
                 next += [opg, opc, op, opgl, oplc]
@@ -81,10 +83,13 @@
         arglist = []
         for arg in op.args[1:]:
             if isinstance(arg, model.Constant):
-                arglist.append(str(arg.value))
+                arglist.append(repr(arg.value))
             else:
                 arglist.append(str(arg))
-        return "(%s)" % ", ".join(arglist)
+        call_str = "(%s)" % ", ".join(arglist)
+        filename = getattr(graph, 'filename', '<unknown>')
+        lineno = offset2lineno(graph.func.func_code, op.offset)
+        return call_str, filename, lineno
         
     def transform_graph(self, graph):
         if getattr(graph, 'explicit_traceback', None):



More information about the Pypy-commit mailing list