[pypy-commit] pypy decimal-libmpdec: Add Context.logical* methods

amauryfa noreply at buildbot.pypy.org
Sun Aug 24 22:27:18 CEST 2014


Author: Amaury Forgeot d'Arc <amauryfa at gmail.com>
Branch: decimal-libmpdec
Changeset: r73036:766ef22b8834
Date: 2014-05-25 18:10 +0200
http://bitbucket.org/pypy/pypy/changeset/766ef22b8834/

Log:	Add Context.logical* methods

diff --git a/pypy/module/_decimal/interp_context.py b/pypy/module/_decimal/interp_context.py
--- a/pypy/module/_decimal/interp_context.py
+++ b/pypy/module/_decimal/interp_context.py
@@ -258,6 +258,8 @@
         return self.unary_method(space, rmpdec.mpd_qround_to_int, w_x)
     def sqrt_w(self, space, w_x):
         return self.unary_method(space, rmpdec.mpd_qsqrt, w_x)
+    def logical_invert_w(self, space, w_x):
+        return self.unary_method(space, rmpdec.mpd_qinvert, w_x)
 
     # Binary arithmetic functions
     def binary_method(self, space, mpd_func, w_x, w_y):
@@ -301,6 +303,12 @@
         return self.binary_method(space, rmpdec.mpd_qrem, w_x, w_y)
     def remainder_near_w(self, space, w_x, w_y):
         return self.binary_method(space, rmpdec.mpd_qrem_near, w_x, w_y)
+    def logical_and_w(self, space, w_x, w_y):
+        return self.binary_method(space, rmpdec.mpd_qand, w_x, w_y)
+    def logical_or_w(self, space, w_x, w_y):
+        return self.binary_method(space, rmpdec.mpd_qor, w_x, w_y)
+    def logical_xor_w(self, space, w_x, w_y):
+        return self.binary_method(space, rmpdec.mpd_qxor, w_x, w_y)
 
     # Ternary operations
     def power_w(self, space, w_a, w_b, w_modulo=None):
@@ -369,6 +377,7 @@
     to_integral_exact=interp2app(W_Context.to_integral_exact_w),
     to_integral_value=interp2app(W_Context.to_integral_value_w),
     sqrt=interp2app(W_Context.sqrt_w),
+    logical_invert=interp2app(W_Context.logical_invert_w),
     # Binary Operations
     add=interp2app(W_Context.add_w),
     subtract=interp2app(W_Context.subtract_w),
@@ -386,6 +395,9 @@
     quantize=interp2app(W_Context.quantize_w),
     remainder=interp2app(W_Context.remainder_w),
     remainder_near=interp2app(W_Context.remainder_near_w),
+    logical_and=interp2app(W_Context.logical_and_w),
+    logical_or=interp2app(W_Context.logical_or_w),
+    logical_xor=interp2app(W_Context.logical_xor_w),
     # Ternary operations
     power=interp2app(W_Context.power_w),
     fma=interp2app(W_Context.fma_w),
diff --git a/pypy/module/_decimal/test/test_context.py b/pypy/module/_decimal/test/test_context.py
--- a/pypy/module/_decimal/test/test_context.py
+++ b/pypy/module/_decimal/test/test_context.py
@@ -14,6 +14,16 @@
             return space.wrap(f)
         cls.w_random_float = space.wrap(gateway.interp2app(random_float))
 
+        # a few functions from unittest library
+        def assertTrue(space, w_x):
+            assert space.is_true(w_x)
+        cls.w_assertTrue = space.wrap(gateway.interp2app(assertTrue))
+        def assertEqual(space, w_x, w_y):
+            assert space.eq_w(w_x, w_y)
+        cls.w_assertEqual = space.wrap(gateway.interp2app(assertEqual))
+
+        cls.w_assertRaises = space.appexec([], """(): return raises""")
+
     def test_context_repr(self):
         c = self.decimal.DefaultContext.copy()
 
@@ -36,30 +46,30 @@
         t = "Context(prec=425000000, rounding=ROUND_HALF_DOWN, " \
             "Emin=-425000000, Emax=425000000, capitals=0, clamp=1, " \
             "flags=[], traps=[])"
-        assert s == t
+        self.assertEqual(s, t)
 
     def test_explicit_context_create_from_float(self):
         Decimal = self.decimal.Decimal
 
         nc = self.decimal.Context()
         r = nc.create_decimal(0.1)
-        assert type(r) is Decimal
-        assert str(r) == '0.1000000000000000055511151231'
-        assert nc.create_decimal(float('nan')).is_qnan()
-        assert nc.create_decimal(float('inf')).is_infinite()
-        assert nc.create_decimal(float('-inf')).is_infinite()
-        assert (str(nc.create_decimal(float('nan'))) ==
-                str(nc.create_decimal('NaN')))
-        assert (str(nc.create_decimal(float('inf'))) ==
-                str(nc.create_decimal('Infinity')))
-        assert (str(nc.create_decimal(float('-inf'))) ==
-                str(nc.create_decimal('-Infinity')))
-        assert (str(nc.create_decimal(float('-0.0'))) ==
-                str(nc.create_decimal('-0')))
+        self.assertEqual(type(r), Decimal)
+        self.assertEqual(str(r), '0.1000000000000000055511151231')
+        self.assertTrue(nc.create_decimal(float('nan')).is_qnan())
+        self.assertTrue(nc.create_decimal(float('inf')).is_infinite())
+        self.assertTrue(nc.create_decimal(float('-inf')).is_infinite())
+        self.assertEqual(str(nc.create_decimal(float('nan'))),
+                         str(nc.create_decimal('NaN')))
+        self.assertEqual(str(nc.create_decimal(float('inf'))),
+                         str(nc.create_decimal('Infinity')))
+        self.assertEqual(str(nc.create_decimal(float('-inf'))),
+                         str(nc.create_decimal('-Infinity')))
+        self.assertEqual(str(nc.create_decimal(float('-0.0'))),
+                         str(nc.create_decimal('-0')))
         nc.prec = 100
         for i in range(200):
             x = self.random_float()
-            assert x == float(nc.create_decimal(x))  # roundtrip
+            self.assertEqual(x, float(nc.create_decimal(x))) # roundtrip
 
     def test_add(self):
         Decimal = self.decimal.Decimal
@@ -67,11 +77,11 @@
 
         c = Context()
         d = c.add(Decimal(1), Decimal(1))
-        assert c.add(1, 1) == d
-        assert c.add(Decimal(1), 1) == d
-        assert c.add(1, Decimal(1)) == d
-        raises(TypeError, c.add, '1', 1)
-        raises(TypeError, c.add, 1, '1')
+        self.assertEqual(c.add(1, 1), d)
+        self.assertEqual(c.add(Decimal(1), 1), d)
+        self.assertEqual(c.add(1, Decimal(1)), d)
+        self.assertRaises(TypeError, c.add, '1', 1)
+        self.assertRaises(TypeError, c.add, 1, '1')
 
     def test_subtract(self):
         Decimal = self.decimal.Decimal
@@ -79,11 +89,11 @@
 
         c = Context()
         d = c.subtract(Decimal(1), Decimal(2))
-        assert c.subtract(1, 2) == d
-        assert c.subtract(Decimal(1), 2) == d
-        assert c.subtract(1, Decimal(2)) == d
-        raises(TypeError, c.subtract, '1', 2)
-        raises(TypeError, c.subtract, 1, '2')
+        self.assertEqual(c.subtract(1, 2), d)
+        self.assertEqual(c.subtract(Decimal(1), 2), d)
+        self.assertEqual(c.subtract(1, Decimal(2)), d)
+        self.assertRaises(TypeError, c.subtract, '1', 2)
+        self.assertRaises(TypeError, c.subtract, 1, '2')
 
     def test_multiply(self):
         Decimal = self.decimal.Decimal
@@ -91,11 +101,11 @@
 
         c = Context()
         d = c.multiply(Decimal(1), Decimal(2))
-        assert c.multiply(1, 2)== d
-        assert c.multiply(Decimal(1), 2)== d
-        assert c.multiply(1, Decimal(2))== d
-        raises(TypeError, c.multiply, '1', 2)
-        raises(TypeError, c.multiply, 1, '2')
+        self.assertEqual(c.multiply(1, 2), d)
+        self.assertEqual(c.multiply(Decimal(1), 2), d)
+        self.assertEqual(c.multiply(1, Decimal(2)), d)
+        self.assertRaises(TypeError, c.multiply, '1', 2)
+        self.assertRaises(TypeError, c.multiply, 1, '2')
 
     def test_divide(self):
         Decimal = self.decimal.Decimal
@@ -103,8 +113,54 @@
 
         c = Context()
         d = c.divide(Decimal(1), Decimal(2))
-        assert c.divide(1, 2)== d
-        assert c.divide(Decimal(1), 2)== d
-        assert c.divide(1, Decimal(2))== d
-        raises(TypeError, c.divide, '1', 2)
-        raises(TypeError, c.divide, 1, '2')
+        self.assertEqual(c.divide(1, 2), d)
+        self.assertEqual(c.divide(Decimal(1), 2), d)
+        self.assertEqual(c.divide(1, Decimal(2)), d)
+        self.assertRaises(TypeError, c.divide, '1', 2)
+        self.assertRaises(TypeError, c.divide, 1, '2')
+
+    def test_logical_and(self):
+        Decimal = self.decimal.Decimal
+        Context = self.decimal.Context
+
+        c = Context()
+        d = c.logical_and(Decimal(1), Decimal(1))
+        self.assertEqual(c.logical_and(1, 1), d)
+        self.assertEqual(c.logical_and(Decimal(1), 1), d)
+        self.assertEqual(c.logical_and(1, Decimal(1)), d)
+        self.assertRaises(TypeError, c.logical_and, '1', 1)
+        self.assertRaises(TypeError, c.logical_and, 1, '1')
+
+    def test_logical_invert(self):
+        Decimal = self.decimal.Decimal
+        Context = self.decimal.Context
+
+        c = Context()
+        d = c.logical_invert(Decimal(1000))
+        self.assertEqual(c.logical_invert(1000), d)
+        self.assertRaises(TypeError, c.logical_invert, '1000')
+
+    def test_logical_or(self):
+        Decimal = self.decimal.Decimal
+        Context = self.decimal.Context
+
+        c = Context()
+        d = c.logical_or(Decimal(1), Decimal(1))
+        self.assertEqual(c.logical_or(1, 1), d)
+        self.assertEqual(c.logical_or(Decimal(1), 1), d)
+        self.assertEqual(c.logical_or(1, Decimal(1)), d)
+        self.assertRaises(TypeError, c.logical_or, '1', 1)
+        self.assertRaises(TypeError, c.logical_or, 1, '1')
+
+    def test_logical_xor(self):
+        Decimal = self.decimal.Decimal
+        Context = self.decimal.Context
+
+        c = Context()
+        d = c.logical_xor(Decimal(1), Decimal(1))
+        self.assertEqual(c.logical_xor(1, 1), d)
+        self.assertEqual(c.logical_xor(Decimal(1), 1), d)
+        self.assertEqual(c.logical_xor(1, Decimal(1)), d)
+        self.assertRaises(TypeError, c.logical_xor, '1', 1)
+        self.assertRaises(TypeError, c.logical_xor, 1, '1')
+
diff --git a/rpython/rlib/rmpdec.py b/rpython/rlib/rmpdec.py
--- a/rpython/rlib/rmpdec.py
+++ b/rpython/rlib/rmpdec.py
@@ -56,7 +56,8 @@
         "mpd_qadd", "mpd_qsub", "mpd_qmul", "mpd_qdiv", "mpd_qdivint",
         "mpd_qrem", "mpd_qrem_near", "mpd_qdivmod", "mpd_qpow", "mpd_qpowmod", 
         "mpd_qfma",
-        "mpd_qexp", "mpd_qln", "mpd_qlog10", "mpd_qsqrt",
+        "mpd_qexp", "mpd_qln", "mpd_qlog10", "mpd_qsqrt", "mpd_qinvert",
+        "mpd_qand", "mpd_qor", "mpd_qxor",
         "mpd_qcopy_sign",
         "mpd_qround_to_int", "mpd_qround_to_intx",
         ],
@@ -313,6 +314,15 @@
 mpd_qrem_near = external(
     'mpd_qrem_near',
     [MPD_PTR, MPD_PTR, MPD_PTR, MPD_CONTEXT_PTR, rffi.UINTP], lltype.Void)
+mpd_qand = external(
+    'mpd_qand',
+    [MPD_PTR, MPD_PTR, MPD_PTR, MPD_CONTEXT_PTR, rffi.UINTP], lltype.Void)
+mpd_qor = external(
+    'mpd_qor',
+    [MPD_PTR, MPD_PTR, MPD_PTR, MPD_CONTEXT_PTR, rffi.UINTP], lltype.Void)
+mpd_qxor = external(
+    'mpd_qxor',
+    [MPD_PTR, MPD_PTR, MPD_PTR, MPD_CONTEXT_PTR, rffi.UINTP], lltype.Void)
 mpd_qdivmod = external(
     'mpd_qdivmod',
     [MPD_PTR, MPD_PTR, MPD_PTR, MPD_PTR, MPD_CONTEXT_PTR, rffi.UINTP],
@@ -341,6 +351,9 @@
 mpd_qsqrt = external(
     'mpd_qsqrt',
     [MPD_PTR, MPD_PTR, MPD_CONTEXT_PTR, rffi.UINTP], lltype.Void)
+mpd_qinvert = external(
+    'mpd_qinvert',
+    [MPD_PTR, MPD_PTR, MPD_CONTEXT_PTR, rffi.UINTP], lltype.Void)
 
 mpd_qcopy_sign = external(
     'mpd_qcopy_sign',


More information about the pypy-commit mailing list