[pypy-commit] pypy continulet-jit-3: Fix the logic for force() and call_may_force()

arigo noreply at buildbot.pypy.org
Sun Oct 21 13:11:54 CEST 2012


Author: Armin Rigo <arigo at tunes.org>
Branch: continulet-jit-3
Changeset: r58307:d497d888e892
Date: 2012-10-21 13:02 +0200
http://bitbucket.org/pypy/pypy/changeset/d497d888e892/

Log:	Fix the logic for force() and call_may_force()

diff --git a/pypy/jit/backend/llgraph/runner.py b/pypy/jit/backend/llgraph/runner.py
--- a/pypy/jit/backend/llgraph/runner.py
+++ b/pypy/jit/backend/llgraph/runner.py
@@ -294,15 +294,6 @@
     def force(self, frame):
         assert not frame._forced
         frame._forced = True
-        call_op = frame.current_op
-        if call_op.getopnum() == rop.FINISH:
-            guard_op = call_op
-        else:
-            guard_op = frame.lltrace.operations[frame.current_index + 1]
-        frame.latest_values = frame._getfailargs(guard_op, call_op.result)
-        descr = _getdescr(guard_op)
-        frame.latest_descr = descr
-        return descr
 
     def set_savedata_ref(self, frame, data):
         frame.saved_data = data
@@ -858,7 +849,16 @@
             res = _example_res[getkind(TP.RESULT)[0]]
         return res
 
-    execute_call_may_force = execute_call
+    def execute_call_may_force(self, calldescr, func, *args):
+        call_op = self.lltrace.operations[self.current_index]
+        guard_op = self.lltrace.operations[self.current_index + 1]
+        assert guard_op.getopnum() == rop.GUARD_NOT_FORCED
+        self.latest_values = self._getfailargs(guard_op, skip=call_op.result)
+        self.latest_descr = _getdescr(guard_op)
+        res = self.execute_call(calldescr, func, *args)
+        del self.latest_descr
+        del self.latest_values
+        return res
 
     def execute_call_release_gil(self, descr, func, *args):
         call_args = support.cast_call_args_in_order(descr.ARGS, args)
diff --git a/pypy/jit/backend/test/runner_test.py b/pypy/jit/backend/test/runner_test.py
--- a/pypy/jit/backend/test/runner_test.py
+++ b/pypy/jit/backend/test/runner_test.py
@@ -2200,8 +2200,10 @@
         def maybe_force(token, flag):
             assert lltype.typeOf(token) == cpu.JITFRAMEPTR
             if flag:
-                descr = self.cpu.force(token)
+                descr = self.cpu.get_latest_descr(token)
                 values.append(descr)
+                x = self.cpu.force(token)
+                assert x is None
                 values.append(self.cpu.get_latest_value_int(token, 0))
                 values.append(self.cpu.get_latest_value_int(token, 1))
                 values.append(token)
@@ -2329,16 +2331,17 @@
         assert values == [1, 10, frame]
 
     def test_force_from_finish(self):
+        finishdescr = BasicFailDescr(1)
         loop = parse('''
         [i1, i2]
         p0 = jit_frame()
         finish(p0, descr=faildescr1) [i1, i2]
-        ''', namespace={'faildescr1': BasicFailDescr(1)})
+        ''', namespace={'faildescr1': finishdescr})
         looptoken = JitCellToken()
         self.cpu.compile_loop(loop.inputargs, loop.operations, looptoken)
         frame = self.cpu.execute_token(looptoken, 20, 0)
-        descr = self.cpu.force(frame)
-        assert self.cpu.get_latest_descr(frame) is descr
+        self.cpu.force(frame)
+        assert self.cpu.get_latest_descr(frame) is finishdescr
         assert self.cpu.get_latest_value_int(frame, 0) == 20
         assert self.cpu.get_latest_value_int(frame, 1) == 0
 


More information about the pypy-commit mailing list