[pypy-svn] r46721 - pypy/dist/pypy/translator/c/test

arigo at codespeak.net arigo at codespeak.net
Tue Sep 18 13:54:02 CEST 2007


Author: arigo
Date: Tue Sep 18 13:54:02 2007
New Revision: 46721

Modified:
   pypy/dist/pypy/translator/c/test/test_lltyped.py
Log:
A passing test about arithmetic corner cases.


Modified: pypy/dist/pypy/translator/c/test/test_lltyped.py
==============================================================================
--- pypy/dist/pypy/translator/c/test/test_lltyped.py	(original)
+++ pypy/dist/pypy/translator/c/test/test_lltyped.py	Tue Sep 18 13:54:02 2007
@@ -387,3 +387,131 @@
         fn = self.getcompiled(f, [int])
         res = fn(100)
         assert res == 3050
+
+    def test_arithmetic_cornercases(self):
+        import operator, sys
+        from pypy.rlib.unroll import unrolling_iterable
+        from pypy.rlib.rarithmetic import r_longlong, r_ulonglong
+
+        class Undefined:
+            def __eq__(self, other):
+                return True
+        undefined = Undefined()
+
+        def getmin(cls):
+            if cls is int:
+                return -sys.maxint-1
+            elif cls.SIGNED:
+                return cls(-(cls.MASK>>1)-1)
+            else:
+                return cls(0)
+        getmin._annspecialcase_ = 'specialize:memo'
+
+        def getmax(cls):
+            if cls is int:
+                return sys.maxint
+            elif cls.SIGNED:
+                return cls(cls.MASK>>1)
+            else:
+                return cls(cls.MASK)
+        getmax._annspecialcase_ = 'specialize:memo'
+        maxlonglong = long(getmax(r_longlong))
+
+        classes = unrolling_iterable([int, r_uint, r_longlong, r_ulonglong])
+        operators = unrolling_iterable([operator.add,
+                                        operator.sub,
+                                        operator.mul,
+                                        operator.floordiv,
+                                        operator.mod,
+                                        operator.lshift,
+                                        operator.rshift])
+        def f(n):
+            result = ()
+            for cls in classes:
+                values = [getmin(cls), getmax(cls)]
+                for OP in operators:
+                    for x in values:
+                        res1 = OP(x, n)
+                        result += (res1,)
+            return result
+
+        def assert_eq(a, b):
+            # for better error messages when it fails
+            assert len(a) == len(b)
+            for i in range(len(a)):
+                assert a[i] == b[i]
+
+        fn = self.getcompiled(f, [int])
+        res = fn(1)
+        print res
+        assert_eq(res, (
+            # int
+            -sys.maxint, undefined,               # add
+            undefined, sys.maxint-1,              # sub
+            -sys.maxint-1, sys.maxint,            # mul
+            -sys.maxint-1, sys.maxint,            # floordiv
+            0, 0,                                 # mod
+            0, -2,                                # lshift
+            (-sys.maxint-1)//2, sys.maxint//2,    # rshift
+            # r_uint
+            1, 0,                                 # add
+            sys.maxint*2+1, sys.maxint*2,         # sub
+            0, sys.maxint*2+1,                    # mul
+            0, sys.maxint*2+1,                    # floordiv
+            0, 0,                                 # mod
+            0, sys.maxint*2,                      # lshift
+            0, sys.maxint,                        # rshift
+            # r_longlong
+            -maxlonglong, undefined,              # add
+            undefined, maxlonglong-1,             # sub
+            -maxlonglong-1, maxlonglong,          # mul
+            -maxlonglong-1, maxlonglong,          # floordiv
+            0, 0,                                 # mod
+            0, -2,                                # lshift
+            (-maxlonglong-1)//2, maxlonglong//2,  # rshift
+            # r_ulonglong
+            1, 0,                                 # add
+            maxlonglong*2+1, maxlonglong*2,       # sub
+            0, maxlonglong*2+1,                   # mul
+            0, maxlonglong*2+1,                   # floordiv
+            0, 0,                                 # mod
+            0, maxlonglong*2,                     # lshift
+            0, maxlonglong,                       # rshift
+            ))
+
+        res = fn(5)
+        print res
+        assert_eq(res, (
+            # int
+            -sys.maxint+4, undefined,             # add
+            undefined, sys.maxint-5,              # sub
+            undefined, undefined,                 # mul
+            (-sys.maxint-1)//5, sys.maxint//5,    # floordiv
+            (-sys.maxint-1)%5, sys.maxint%5,      # mod
+            0, -32,                               # lshift
+            (-sys.maxint-1)//32, sys.maxint//32,  # rshift
+            # r_uint
+            5, 4,                                 # add
+            sys.maxint*2-3, sys.maxint*2-4,       # sub
+            0, sys.maxint*2-3,                    # mul
+            0, (sys.maxint*2+1)//5,               # floordiv
+            0, (sys.maxint*2+1)%5,                # mod
+            0, sys.maxint*2-30,                   # lshift
+            0, sys.maxint>>4,                     # rshift
+            # r_longlong
+            -maxlonglong+4, undefined,            # add
+            undefined, maxlonglong-5,             # sub
+            undefined, undefined,                 # mul
+            (-maxlonglong-1)//5, maxlonglong//5,  # floordiv
+            (-maxlonglong-1)%5, maxlonglong%5,    # mod
+            0, -32,                               # lshift
+            (-maxlonglong-1)//32, maxlonglong//32,# rshift
+            # r_ulonglong
+            5, 4,                                 # add
+            maxlonglong*2-3, maxlonglong*2-4,     # sub
+            0, maxlonglong*2-3,                   # mul
+            0, (maxlonglong*2+1)//5,              # floordiv
+            0, (maxlonglong*2+1)%5,               # mod
+            0, maxlonglong*2-30,                  # lshift
+            0, maxlonglong>>4,                    # rshift
+            ))



More information about the Pypy-commit mailing list