Author: Armin Rigo <ar...@tunes.org> Branch: Changeset: r83414:bd677c5dd9b8 Date: 2016-03-29 10:50 +0200 http://bitbucket.org/pypy/pypy/changeset/bd677c5dd9b8/
Log: Test and fix: we could get in obscure cases an AssertionError that should really be just an InvalidLoop diff --git a/rpython/jit/metainterp/optimizeopt/optimizer.py b/rpython/jit/metainterp/optimizeopt/optimizer.py --- a/rpython/jit/metainterp/optimizeopt/optimizer.py +++ b/rpython/jit/metainterp/optimizeopt/optimizer.py @@ -7,6 +7,7 @@ from rpython.jit.metainterp.resoperation import rop, AbstractResOp, GuardResOp,\ OpHelpers, ResOperation from rpython.jit.metainterp.optimizeopt import info +from rpython.jit.metainterp.optimize import InvalidLoop from rpython.jit.metainterp.typesystem import llhelper from rpython.rlib.objectmodel import specialize, we_are_translated from rpython.rlib.debug import debug_print @@ -411,11 +412,14 @@ def make_constant(self, box, constbox): assert isinstance(constbox, Const) box = self.get_box_replacement(box) - if not we_are_translated(): # safety-check - if (box.get_forwarded() is not None and - isinstance(constbox, ConstInt) and - not isinstance(box.get_forwarded(), info.AbstractRawPtrInfo)): - assert box.get_forwarded().contains(constbox.getint()) + # safety-check: if the constant is outside the bounds for the + # box, then it is an invalid loop + if (box.get_forwarded() is not None and + isinstance(constbox, ConstInt) and + not isinstance(box.get_forwarded(), info.AbstractRawPtrInfo)): + if not box.get_forwarded().contains(constbox.getint()): + raise InvalidLoop("a box is turned into constant that is " + "outside the range allowed for that box") if box.is_constant(): return if box.type == 'r' and box.get_forwarded() is not None: diff --git a/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py b/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py --- a/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py +++ b/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py @@ -3072,6 +3072,16 @@ """ self.raises(InvalidLoop, self.optimize_loop, ops, ops) + def test_invalid_guard_value_after_bounds(self): + ops = """ + [i0] + i1 = int_gt(i0, 5) + guard_true(i1) [] + guard_value(i0, 2) [] + jump() + """ + self.raises(InvalidLoop, self.optimize_loop, ops, ops) + def test_guard_class_oois(self): ops = """ [p1] _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit