[pypy-commit] pypy decimal-libmpdec: Add missing exceptions

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


Author: Amaury Forgeot d'Arc <amauryfa at gmail.com>
Branch: decimal-libmpdec
Changeset: r73041:54777ea9fbaf
Date: 2014-05-25 21:31 +0200
http://bitbucket.org/pypy/pypy/changeset/54777ea9fbaf/

Log:	Add missing exceptions

diff --git a/pypy/module/_decimal/__init__.py b/pypy/module/_decimal/__init__.py
--- a/pypy/module/_decimal/__init__.py
+++ b/pypy/module/_decimal/__init__.py
@@ -29,4 +29,8 @@
         interpleveldefs[name] = 'space.wrap(%r)' % name
     for name, flag in interp_signals.SIGNAL_MAP:
         interpleveldefs[name] = 'interp_signals.get(space).w_%s' % name
+    for name, flag in interp_signals.COND_MAP:
+        if name == 'InvalidOperation':
+            pass
+        interpleveldefs[name] = 'interp_signals.get(space).w_%s' % name
         
diff --git a/pypy/module/_decimal/interp_signals.py b/pypy/module/_decimal/interp_signals.py
--- a/pypy/module/_decimal/interp_signals.py
+++ b/pypy/module/_decimal/interp_signals.py
@@ -127,5 +127,22 @@
                 getattr(self, 'w_' + name)
                 for name, flag in SIGNAL_MAP])
 
+        # Add remaining exceptions, inherit from InvalidOperation
+        for name, flag in COND_MAP:
+            if name == 'InvalidOperation':
+                # Unfortunately, InvalidOperation is a signal that
+                # comprises several conditions, including
+                # InvalidOperation! Naming the signal
+                # IEEEInvalidOperation would prevent the confusion.
+                continue
+            if name == 'DivisionUndefined':
+                w_bases = space.newtuple([self.w_InvalidOperation,
+                                          space.w_ZeroDivisionError])
+            else:
+                w_bases = space.newtuple([self.w_InvalidOperation])
+            setattr(self, 'w_' + name,
+                    space.call_function(
+                    space.w_type, space.wrap(name), w_bases, space.newdict()))
+
 def get(space):
     return space.fromcache(SignalState)
diff --git a/pypy/module/_decimal/test/test_module.py b/pypy/module/_decimal/test/test_module.py
--- a/pypy/module/_decimal/test/test_module.py
+++ b/pypy/module/_decimal/test/test_module.py
@@ -51,6 +51,45 @@
             assert issubclass(ex, _decimal.DecimalException)
             assert issubclass(ex, ArithmeticError)
 
+    def test_exception_hierarchy(self):
+        import _decimal as decimal
+        DecimalException = decimal.DecimalException
+        InvalidOperation = decimal.InvalidOperation
+        FloatOperation = decimal.FloatOperation
+        DivisionByZero = decimal.DivisionByZero
+        Overflow = decimal.Overflow
+        Underflow = decimal.Underflow
+        Subnormal = decimal.Subnormal
+        Inexact = decimal.Inexact
+        Rounded = decimal.Rounded
+        Clamped = decimal.Clamped
+
+        assert issubclass(DecimalException, ArithmeticError)
+
+        assert issubclass(InvalidOperation, DecimalException)
+        assert issubclass(FloatOperation, DecimalException)
+        assert issubclass(FloatOperation, TypeError)
+        assert issubclass(DivisionByZero, DecimalException)
+        assert issubclass(DivisionByZero, ZeroDivisionError)
+        assert issubclass(Overflow, Rounded)
+        assert issubclass(Overflow, Inexact)
+        assert issubclass(Overflow, DecimalException)
+        assert issubclass(Underflow, Inexact)
+        assert issubclass(Underflow, Rounded)
+        assert issubclass(Underflow, Subnormal)
+        assert issubclass(Underflow, DecimalException)
+
+        assert issubclass(Subnormal, DecimalException)
+        assert issubclass(Inexact, DecimalException)
+        assert issubclass(Rounded, DecimalException)
+        assert issubclass(Clamped, DecimalException)
+
+        assert issubclass(decimal.ConversionSyntax, InvalidOperation)
+        assert issubclass(decimal.DivisionImpossible, InvalidOperation)
+        assert issubclass(decimal.DivisionUndefined, InvalidOperation)
+        assert issubclass(decimal.DivisionUndefined, ZeroDivisionError)
+        assert issubclass(decimal.InvalidContext, InvalidOperation)
+
     def test_threads(self):
         import _decimal
         assert (_decimal.HAVE_THREADS is False or


More information about the pypy-commit mailing list