[pypy-commit] pypy optinfo-into-bridges-2: fix two bugs in 3170ca56ec4a:

cfbolz pypy.commits at gmail.com
Tue Feb 21 07:50:20 EST 2017


Author: Carl Friedrich Bolz <cfbolz at gmx.de>
Branch: optinfo-into-bridges-2
Changeset: r90260:fec88c2114cb
Date: 2017-02-19 22:02 +0100
http://bitbucket.org/pypy/pypy/changeset/fec88c2114cb/

Log:	fix two bugs in 3170ca56ec4a:

	- wraparound problems in integer_fits
	- pending fields were broken by the change from short to regular
	integers

diff --git a/rpython/jit/metainterp/resume.py b/rpython/jit/metainterp/resume.py
--- a/rpython/jit/metainterp/resume.py
+++ b/rpython/jit/metainterp/resume.py
@@ -1004,8 +1004,8 @@
         if pendingfields:
             for i in range(len(pendingfields)):
                 lldescr = pendingfields[i].lldescr
-                num = pendingfields[i].num
-                fieldnum = pendingfields[i].fieldnum
+                num = rarithmetic.widen(pendingfields[i].num)
+                fieldnum = rarithmetic.widen(pendingfields[i].fieldnum)
                 itemindex = pendingfields[i].itemindex
                 descr = annlowlevel.cast_base_ptr_to_instance(AbstractDescr,
                                                               lldescr)
diff --git a/rpython/jit/metainterp/resumecode.py b/rpython/jit/metainterp/resumecode.py
--- a/rpython/jit/metainterp/resumecode.py
+++ b/rpython/jit/metainterp/resumecode.py
@@ -22,15 +22,18 @@
 """
 
 from rpython.rtyper.lltypesystem import rffi, lltype
-from rpython.rlib import objectmodel
+from rpython.rlib import objectmodel, rarithmetic
 
 class TagOverflow(Exception):
     pass
 
 def integer_fits(item):
-    item *= 2
+    try:
+        item = rarithmetic.ovfcheck(item * 2)
+    except OverflowError:
+        return False
     if item < 0:
-       item = ~item
+        item = ~item # can't overflow
     # we can fit up to 22 content bits into 1-3 bytes (24 bits, with 2 continuation
     # bits)
     return item < 2 ** 22
diff --git a/rpython/jit/metainterp/test/test_resumecode.py b/rpython/jit/metainterp/test/test_resumecode.py
--- a/rpython/jit/metainterp/test/test_resumecode.py
+++ b/rpython/jit/metainterp/test/test_resumecode.py
@@ -1,3 +1,4 @@
+import sys
 import pytest
 from rpython.jit.metainterp.resumecode import create_numbering,\
     unpack_numbering, Reader, Writer, TagOverflow
@@ -7,12 +8,10 @@
 
 def test_tag_overflow():
     w = Writer()
-    with pytest.raises(TagOverflow):
-        w.append_int(2**21)
-    with pytest.raises(TagOverflow):
-        w.append_int(-2**22)
-    with pytest.raises(TagOverflow):
-        w.append_int(-2**21-1)
+    for bad in [2 ** 21, -2**22, -2**21-1,
+                sys.maxint, -sys.maxint-1]:
+        with pytest.raises(TagOverflow):
+            w.append_int(bad)
 
 examples = [
     [1, 2, 3, 4, 257, 10000, 13, 15],


More information about the pypy-commit mailing list