Author: Antonio Cuni <anto.c...@gmail.com> Branch: Changeset: r53095:ee7e8bd31c25 Date: 2012-03-02 10:35 +0100 http://bitbucket.org/pypy/pypy/changeset/ee7e8bd31c25/
Log: merge heads 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 @@ -266,6 +266,38 @@ res = self.cpu.get_latest_value_int(0) assert res == 20 + def test_compile_big_bridge_out_of_small_loop(self): + i0 = BoxInt() + faildescr1 = BasicFailDescr(1) + looptoken = JitCellToken() + operations = [ + ResOperation(rop.GUARD_FALSE, [i0], None, descr=faildescr1), + ResOperation(rop.FINISH, [], None, descr=BasicFailDescr(2)), + ] + inputargs = [i0] + operations[0].setfailargs([i0]) + self.cpu.compile_loop(inputargs, operations, looptoken) + + i1list = [BoxInt() for i in range(1000)] + bridge = [] + iprev = i0 + for i1 in i1list: + bridge.append(ResOperation(rop.INT_ADD, [iprev, ConstInt(1)], i1)) + iprev = i1 + bridge.append(ResOperation(rop.GUARD_FALSE, [i0], None, + descr=BasicFailDescr(3))) + bridge.append(ResOperation(rop.FINISH, [], None, + descr=BasicFailDescr(4))) + bridge[-2].setfailargs(i1list) + + self.cpu.compile_bridge(faildescr1, [i0], bridge, looptoken) + + fail = self.cpu.execute_token(looptoken, 1) + assert fail.identifier == 3 + for i in range(1000): + res = self.cpu.get_latest_value_int(i) + assert res == 2 + i + def test_get_latest_value_count(self): i0 = BoxInt() i1 = BoxInt() diff --git a/pypy/jit/metainterp/blackhole.py b/pypy/jit/metainterp/blackhole.py --- a/pypy/jit/metainterp/blackhole.py +++ b/pypy/jit/metainterp/blackhole.py @@ -1379,7 +1379,8 @@ elif opnum == rop.GUARD_NO_OVERFLOW: # Produced by int_xxx_ovf(). The pc is just after the opcode. # We get here because it did not used to overflow, but now it does. - return get_llexception(self.cpu, OverflowError()) + if not dont_change_position: + return get_llexception(self.cpu, OverflowError()) # elif opnum == rop.GUARD_OVERFLOW: # Produced by int_xxx_ovf(). The pc is just after the opcode. diff --git a/pypy/jit/metainterp/pyjitpl.py b/pypy/jit/metainterp/pyjitpl.py --- a/pypy/jit/metainterp/pyjitpl.py +++ b/pypy/jit/metainterp/pyjitpl.py @@ -2064,11 +2064,12 @@ pass # XXX we want to do something special in resume descr, # but not now elif opnum == rop.GUARD_NO_OVERFLOW: # an overflow now detected - self.execute_raised(OverflowError(), constant=True) - try: - self.finishframe_exception() - except ChangeFrame: - pass + if not dont_change_position: + self.execute_raised(OverflowError(), constant=True) + try: + self.finishframe_exception() + except ChangeFrame: + pass elif opnum == rop.GUARD_OVERFLOW: # no longer overflowing self.clear_exception() else: diff --git a/pypy/jit/metainterp/test/test_ajit.py b/pypy/jit/metainterp/test/test_ajit.py --- a/pypy/jit/metainterp/test/test_ajit.py +++ b/pypy/jit/metainterp/test/test_ajit.py @@ -288,10 +288,10 @@ if y&4 == 0: x1, x2 = x2, x1 return res + res = self.meta_interp(f, [6, sys.maxint, 32, 48]) + assert res == f(6, sys.maxint, 32, 48) res = self.meta_interp(f, [sys.maxint, 6, 32, 48]) assert res == f(sys.maxint, 6, 32, 48) - res = self.meta_interp(f, [6, sys.maxint, 32, 48]) - assert res == f(6, sys.maxint, 32, 48) def test_loop_invariant_intbox(self): diff --git a/pypy/jit/metainterp/warmspot.py b/pypy/jit/metainterp/warmspot.py --- a/pypy/jit/metainterp/warmspot.py +++ b/pypy/jit/metainterp/warmspot.py @@ -100,7 +100,7 @@ if not kwds.get('translate_support_code', False): warmrunnerdesc.metainterp_sd.profiler.finish() warmrunnerdesc.metainterp_sd.cpu.finish_once() - print '~~~ return value:', res + print '~~~ return value:', repr(res) while repeat > 1: print '~' * 79 res1 = interp.eval_graph(graph, args) _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit