Author: Armin Rigo <[email protected]>
Branch: 
Changeset: r83516:7c00ff49e3ee
Date: 2016-04-05 12:01 +0300
http://bitbucket.org/pypy/pypy/changeset/7c00ff49e3ee/

Log:    (fijal, arigo)

        test and fix: unpack() on a Trace which contains half-written
        operations (here because it got a FrontendTagOverflow)

diff --git a/rpython/jit/metainterp/opencoder.py 
b/rpython/jit/metainterp/opencoder.py
--- a/rpython/jit/metainterp/opencoder.py
+++ b/rpython/jit/metainterp/opencoder.py
@@ -141,6 +141,8 @@
         return self.pos >= self.end
 
     def _next(self):
+        if self.done():
+            raise IndexError
         res = rffi.cast(lltype.Signed, self.trace._ops[self.pos])
         self.pos += 1
         return res
@@ -483,8 +485,11 @@
     def unpack(self):
         iter = self.get_iter()
         ops = []
-        while not iter.done():
-            ops.append(iter.next())
+        try:
+            while True:
+                ops.append(iter.next())
+        except IndexError:
+            pass
         return iter.inputargs, ops
 
 def tag(kind, pos):
diff --git a/rpython/jit/metainterp/test/test_opencoder.py 
b/rpython/jit/metainterp/test/test_opencoder.py
--- a/rpython/jit/metainterp/test/test_opencoder.py
+++ b/rpython/jit/metainterp/test/test_opencoder.py
@@ -1,5 +1,6 @@
-
+import py
 from rpython.jit.metainterp.opencoder import Trace, untag, TAGINT, TAGBOX
+from rpython.jit.metainterp.opencoder import FrontendTagOverflow
 from rpython.jit.metainterp.resoperation import rop, AbstractResOp
 from rpython.jit.metainterp.history import ConstInt, IntFrontendOp
 from rpython.jit.metainterp.optimizeopt.optimizer import Optimizer
@@ -204,3 +205,9 @@
         t.record_op(rop.ESCAPE_N, [ConstInt(3)])
         t.record_op(rop.FINISH, [i4])
         assert t.get_dead_ranges() == [0, 0, 0, 0, 0, 3, 4, 5]
+
+    def test_tag_overflow(self):
+        t = Trace([], metainterp_sd)
+        i0 = FakeOp(100000)
+        py.test.raises(FrontendTagOverflow, t.record_op, rop.FINISH, [i0])
+        assert t.unpack() == ([], [])
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to