[pypy-svn] r67606 - pypy/trunk/pypy/jit/metainterp/test
cfbolz at codespeak.net
cfbolz at codespeak.net
Thu Sep 10 12:40:27 CEST 2009
Author: cfbolz
Date: Thu Sep 10 12:40:25 2009
New Revision: 67606
Modified:
pypy/trunk/pypy/jit/metainterp/test/test_recursive.py
Log:
(pedronis, micke, cfbolz) a xfailing test about a hook on leaving the jit before a portal call
that we think we need to untangle the escaping frame problems
Modified: pypy/trunk/pypy/jit/metainterp/test/test_recursive.py
==============================================================================
--- pypy/trunk/pypy/jit/metainterp/test/test_recursive.py (original)
+++ pypy/trunk/pypy/jit/metainterp/test/test_recursive.py Thu Sep 10 12:40:25 2009
@@ -1,5 +1,5 @@
import py
-from pypy.rlib.jit import JitDriver
+from pypy.rlib.jit import JitDriver, we_are_jitted
from pypy.jit.metainterp.test.test_basic import LLJitMixin, OOJitMixin
from pypy.jit.metainterp import simple_optimize
from pypy.jit.metainterp.policy import StopAtXPolicy
@@ -377,6 +377,71 @@
self.check_loops(call=0)
+ @py.test.mark.xfail
+ def test_leave_jit_hook(self):
+ from pypy.rpython.annlowlevel import hlstr
+ def p(code, pc):
+ code = hlstr(code)
+ return "%s %d %s" % (code, pc, code[pc])
+ def c(code, pc):
+ return "l" not in hlstr(code)
+
+ def leave(frame, code):
+ frame.hookcalled = True
+
+ class ExpectedHook(Exception):
+ pass
+ class UnexpectedHook(Exception):
+ pass
+
+ myjitdriver = JitDriver(greens=['code', 'pc'], reds=['self'],
+ get_printable_location=p, can_inline=c)
+ class Frame(object):
+ def __init__(self, n):
+ self.n = n
+ self.hookcalled = False
+ def f(self, code):
+ pc = 0
+ while pc < len(code):
+
+ myjitdriver.jit_merge_point(self=self, code=code, pc=pc)
+ op = code[pc]
+ if op == "-":
+ self.n -= 1
+ elif op == "c":
+ frame = Frame(self.n)
+ self.n = frame.f("---i---")
+ if we_are_jitted():
+ if frame.hookcalled:
+ raise UnexpectedHook
+ elif op == "C":
+ frame = Frame(self.n)
+ self.n = frame.f("cL")
+ if we_are_jitted():
+ if not frame.hookcalled:
+ raise ExpectedHook
+ elif op == "i":
+ if self.n % 5 == 1:
+ return self.n
+ elif op == "l":
+ if self.n > 0:
+ myjitdriver.can_enter_jit(self=self, code=code, pc=0)
+ pc = 0
+ continue
+ elif op == "L":
+ if self.n > 50:
+ myjitdriver.can_enter_jit(self=self, code=code, pc=0)
+ pc = 0
+ continue
+ else:
+ assert 0
+ pc += 1
+ return self.n
+ def main(n):
+ frame = Frame(n)
+ return frame.f("C-l")
+ res = self.meta_interp(main, [100], optimizer=simple_optimize, inline=True)
+ assert res == main(100)
class TestLLtype(RecursiveTests, LLJitMixin):
pass
More information about the Pypy-commit
mailing list