[pypy-svn] r71265 - in pypy/trunk/pypy/jit/metainterp: . test
cfbolz at codespeak.net
cfbolz at codespeak.net
Wed Feb 17 13:56:39 CET 2010
Author: cfbolz
Date: Wed Feb 17 13:56:37 2010
New Revision: 71265
Modified:
pypy/trunk/pypy/jit/metainterp/test/test_recursive.py
pypy/trunk/pypy/jit/metainterp/test/test_send.py
pypy/trunk/pypy/jit/metainterp/test/test_virtual.py
pypy/trunk/pypy/jit/metainterp/warmstate.py
Log:
Fix for r71264: never trace code that is already being traced somewhere else on
the stack. This changes the outcome for some tests in non-important ways.
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 Wed Feb 17 13:56:37 2010
@@ -73,7 +73,7 @@
print '%3d %9d' % (i, f(i))
res = self.meta_interp(main, [10], optimizer=OPTIMIZER_SIMPLE)
assert res == main(10)
- self.check_enter_count_at_most(10)
+ self.check_enter_count_at_most(11)
def test_bug_1(self):
myjitdriver = JitDriver(greens=[], reds=['n', 'i', 'stack'])
@@ -367,7 +367,7 @@
res = self.meta_interp(loop, [100], optimizer=OPTIMIZER_SIMPLE, inline=True, trace_limit=TRACE_LIMIT)
assert res == 0
self.check_max_trace_length(TRACE_LIMIT)
- self.check_enter_count(15) # maybe
+ self.check_enter_count_at_most(10) # maybe
self.check_aborted_count(7)
def test_trace_limit_bridge(self):
@@ -666,7 +666,6 @@
self.meta_interp(portal, [2], inline=True)
self.check_history(call_assembler=1)
- @py.test.mark.xfail
def test_recursion_cant_call_assembler_directly(self):
driver = JitDriver(greens = ['codeno'], reds = ['i', 'j'],
get_printable_location = lambda codeno : str(codeno),
@@ -684,8 +683,8 @@
portal(2, 50)
self.meta_interp(portal, [2, 20], inline=True)
- self.check_history(call_assembler=0)
- self.check_enter_count_at_most(4)
+ self.check_history(call_assembler=0, call_may_force=1)
+ self.check_enter_count_at_most(1)
def test_directly_call_assembler_return(self):
driver = JitDriver(greens = ['codeno'], reds = ['i', 'k'],
Modified: pypy/trunk/pypy/jit/metainterp/test/test_send.py
==============================================================================
--- pypy/trunk/pypy/jit/metainterp/test/test_send.py (original)
+++ pypy/trunk/pypy/jit/metainterp/test/test_send.py Wed Feb 17 13:56:37 2010
@@ -312,7 +312,7 @@
return x
res = self.meta_interp(f, [198], policy=StopAtXPolicy(externfn))
assert res == f(198)
- self.check_loop_count(3)
+ self.check_loop_count(4)
def test_indirect_call_unknown_object_2(self):
myjitdriver = JitDriver(greens = [], reds = ['x', 'y', 'state'])
Modified: pypy/trunk/pypy/jit/metainterp/test/test_virtual.py
==============================================================================
--- pypy/trunk/pypy/jit/metainterp/test/test_virtual.py (original)
+++ pypy/trunk/pypy/jit/metainterp/test/test_virtual.py Wed Feb 17 13:56:37 2010
@@ -143,8 +143,8 @@
node = next
n -= 1
return node.value
- res = self.meta_interp(f, [10], policy=StopAtXPolicy(externfn))
- assert res == f(10)
+ res = self.meta_interp(f, [11], policy=StopAtXPolicy(externfn))
+ assert res == f(11)
self.check_loop_count(2)
self.check_loops(**{self._new_op: 2}) # XXX was 1
self.check_loops(int_mul=0, call=1)
Modified: pypy/trunk/pypy/jit/metainterp/warmstate.py
==============================================================================
--- pypy/trunk/pypy/jit/metainterp/warmstate.py (original)
+++ pypy/trunk/pypy/jit/metainterp/warmstate.py Wed Feb 17 13:56:37 2010
@@ -227,12 +227,14 @@
if n <= self.THRESHOLD_LIMIT: # bound not reached
cell.counter = n
return
- # bound reached; start tracing
if not confirm_enter_jit(*args):
cell.counter = 0
return
+ # bound reached; start tracing
from pypy.jit.metainterp.pyjitpl import MetaInterp
metainterp = MetaInterp(metainterp_sd)
+ # set counter to -2, to mean "tracing in effect"
+ cell.counter = -2
try:
loop_token = metainterp.compile_and_run_once(*args)
except ContinueRunningNormally:
@@ -240,7 +242,15 @@
cell.counter = 0
self.disable_noninlinable_function(metainterp)
raise
+ finally:
+ if cell.counter == -2:
+ cell.counter = 0
else:
+ if cell.counter == -2:
+ # tracing already happening in some outer invocation of
+ # this function. don't trace a second time.
+ return
+ assert cell.counter == -1
if not confirm_enter_jit(*args):
return
# machine code was already compiled for these greenargs
@@ -296,9 +306,14 @@
return self.jit_getter
#
class JitCell(BaseJitCell):
+ # the counter can mean the following things:
+ # counter >= 0: not yet traced, wait till threshold is reached
+ # counter == -1: there is an entry bridge for this cell
+ # counter == -2: tracing is currently going on for this cell
counter = 0
compiled_merge_points = None
dont_trace_here = False
+ entry_loop_token = None
#
if self.warmrunnerdesc.get_jitcell_at_ptr is None:
jit_getter = self._make_jitcell_getter_default(JitCell)
More information about the Pypy-commit
mailing list