[pypy-svn] r70795 - in pypy/branch/direct-assembler-call/pypy/jit/metainterp: . test
fijal at codespeak.net
fijal at codespeak.net
Sun Jan 24 11:39:54 CET 2010
Author: fijal
Date: Sun Jan 24 11:39:53 2010
New Revision: 70795
Modified:
pypy/branch/direct-assembler-call/pypy/jit/metainterp/pyjitpl.py
pypy/branch/direct-assembler-call/pypy/jit/metainterp/test/test_recursive.py
Log:
(fijal, SJ train)
Implement the correct thing, by generating a guard_value for green args
for CALL_ASSEMBLER. they should go away in normal cases
Modified: pypy/branch/direct-assembler-call/pypy/jit/metainterp/pyjitpl.py
==============================================================================
--- pypy/branch/direct-assembler-call/pypy/jit/metainterp/pyjitpl.py (original)
+++ pypy/branch/direct-assembler-call/pypy/jit/metainterp/pyjitpl.py Sun Jan 24 11:39:53 2010
@@ -660,8 +660,8 @@
return False
return self.perform_call(leave_code, varargs)
- @arguments("descr", "varargs")
- def opimpl_recursive_call(self, calldescr, varargs):
+ @arguments("orgpc", "descr", "varargs")
+ def opimpl_recursive_call(self, pc, calldescr, varargs):
warmrunnerstate = self.metainterp.staticdata.state
token = None
if not self.metainterp.is_blackholing() and warmrunnerstate.inlining:
@@ -674,6 +674,10 @@
call_position = 0
if token is not None:
call_position = len(self.metainterp.history.operations)
+ # guard value for all green args, needed to make sure
+ # that assembler that we call is still correct
+ greenargs = varargs[1:num_green_args + 1]
+ self.generate_guard_value_for_green_args(pc, greenargs)
res = self.do_residual_call(varargs, descr=calldescr, exc=True)
if not self.metainterp.is_blackholing() and token is not None:
# XXX fix the call position, <UGLY!>
@@ -687,7 +691,8 @@
assert found
# </UGLY!>
# this will substitute the residual call with assembler call
- self.metainterp.direct_assembler_call(varargs, token, call_position)
+ self.metainterp.direct_assembler_call(pc, varargs, token,
+ call_position)
return res
@arguments("descr", "varargs")
@@ -798,7 +803,7 @@
def opimpl_keepalive(self, box):
pass # xxx?
- def generate_merge_point(self, pc, varargs):
+ def generate_guard_value_for_green_args(self, pc, varargs):
num_green_args = self.metainterp.staticdata.num_green_args
for i in range(num_green_args):
varargs[i] = self.implement_guard_value(pc, varargs[i])
@@ -838,7 +843,7 @@
@arguments("orgpc")
def opimpl_jit_merge_point(self, pc):
if not self.metainterp.is_blackholing():
- self.generate_merge_point(pc, self.env)
+ self.generate_guard_value_for_green_args(pc, self.env)
# xxx we may disable the following line in some context later
self.debug_merge_point()
if self.metainterp.seen_can_enter_jit:
@@ -2025,7 +2030,7 @@
max_key = key
return max_key
- def direct_assembler_call(self, varargs, token, call_position):
+ def direct_assembler_call(self, pc, varargs, token, call_position):
""" Generate a direct call to assembler for portal entry point.
"""
assert not self.is_blackholing() # XXX
Modified: pypy/branch/direct-assembler-call/pypy/jit/metainterp/test/test_recursive.py
==============================================================================
--- pypy/branch/direct-assembler-call/pypy/jit/metainterp/test/test_recursive.py (original)
+++ pypy/branch/direct-assembler-call/pypy/jit/metainterp/test/test_recursive.py Sun Jan 24 11:39:53 2010
@@ -911,7 +911,6 @@
assert res == main(0)
def test_assembler_call_red_args(self):
- py.test.skip("FAIL")
driver = JitDriver(greens = ['codeno'], reds = ['i', 'k'],
get_printable_location = lambda codeno : str(codeno),
can_inline = lambda codeno : False)
@@ -938,6 +937,7 @@
res = self.meta_interp(portal, [2, 0], inline=True,
policy=StopAtXPolicy(residual))
assert res == portal(2, 0)
+ self.check_loops(call_assembler=2)
# There is a test which I fail to write.
# * what happens if we call recursive_call while blackholing
@@ -949,4 +949,3 @@
class TestOOtype(RecursiveTests, OOJitMixin):
pass
-
More information about the Pypy-commit
mailing list