[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