[pypy-commit] pypy array-propagate-len: add integer bounds on FieldDescr

squeaky noreply at buildbot.pypy.org
Sat Feb 15 18:21:16 CET 2014


Author: Squeaky <squeaky_pl at gmx.com>
Branch: array-propagate-len
Changeset: r69153:3830704ee5eb
Date: 2014-02-14 15:52 +0100
http://bitbucket.org/pypy/pypy/changeset/3830704ee5eb/

Log:	add integer bounds on FieldDescr

diff --git a/rpython/jit/backend/llsupport/descr.py b/rpython/jit/backend/llsupport/descr.py
--- a/rpython/jit/backend/llsupport/descr.py
+++ b/rpython/jit/backend/llsupport/descr.py
@@ -103,6 +103,26 @@
     def is_field_signed(self):
         return self.flag == FLAG_SIGNED
 
+    def is_integer_bounded(self):
+        return self.flag in (FLAG_SIGNED, FLAG_UNSIGNED) \
+            and self.field_size < symbolic.WORD
+
+    def get_integer_min(self):
+        if self.flag == FLAG_UNSIGNED:
+            return 0
+        elif self.flag == FLAG_SIGNED:
+            return -(1 << ((self.field_size << 3) - 1))
+
+        assert False
+
+    def get_integer_max(self):
+        if self.flag == FLAG_UNSIGNED:
+            return (1 << (self.field_size << 3)) - 1
+        elif self.flag == FLAG_SIGNED:
+            return (1 << ((self.field_size << 3) - 1)) - 1
+
+        assert False
+
     def sort_key(self):
         return self.offset
 
diff --git a/rpython/jit/backend/llsupport/test/test_descr.py b/rpython/jit/backend/llsupport/test/test_descr.py
--- a/rpython/jit/backend/llsupport/test/test_descr.py
+++ b/rpython/jit/backend/llsupport/test/test_descr.py
@@ -432,3 +432,21 @@
     assert descr.basesize == struct.calcsize("PP")         # hash, length
     assert descr.lendescr.offset == struct.calcsize("P")   # hash
     assert not descr.is_array_of_pointers()
+
+
+def test_descr_integer_bounded():
+    descr = FieldDescr('descr', 0, 1, FLAG_SIGNED)
+    assert descr.is_integer_bounded()
+
+    descr = FieldDescr('descr', 0, symbolic.WORD, FLAG_UNSIGNED)
+    assert not descr.is_integer_bounded()
+
+
+def test_descr_get_integer_bounds():
+    descr = FieldDescr('decr', 0, 1, FLAG_UNSIGNED)
+    assert descr.get_integer_min() == 0
+    assert descr.get_integer_max() == 255
+
+    descr = FieldDescr('descr', 0, 1, FLAG_SIGNED)
+    assert descr.get_integer_min() == -128
+    assert descr.get_integer_max() == 127


More information about the pypy-commit mailing list