[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