[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