[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