[pypy-commit] pypy decimal-libmpdec: Add decimal "Signals", i.e. exceptions.

amauryfa noreply at buildbot.pypy.org
Sun May 11 00:27:36 CEST 2014


Author: Amaury Forgeot d'Arc <amauryfa at gmail.com>
Branch: decimal-libmpdec
Changeset: r71448:2ca4490e70b9
Date: 2014-05-01 23:03 +0200
http://bitbucket.org/pypy/pypy/changeset/2ca4490e70b9/

Log:	Add decimal "Signals", i.e. 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
@@ -7,5 +7,11 @@
     interpleveldefs = {
         'Decimal': 'interp_decimal.W_Decimal',
         'getcontext': 'interp_context.getcontext',
+
         'IEEE_CONTEXT_MAX_BITS': 'space.wrap(interp_decimal.IEEE_CONTEXT_MAX_BITS)',
         }
+    for name in ('DecimalException', 'Clamped', 'Rounded', 'Inexact',
+                 'Subnormal', 'Underflow', 'Overflow', 'DivisionByZero',
+                 'InvalidOperation', 'FloatOperation'):
+        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
new file mode 100644
--- /dev/null
+++ b/pypy/module/_decimal/interp_signals.py
@@ -0,0 +1,50 @@
+class SignalState:
+    def __init__(self, space):
+        self.w_DecimalException = space.call_function(
+            space.w_type, space.wrap("DecimalException"),
+            space.newtuple([space.w_ArithmeticError]),
+            space.newdict())
+        self.w_Clamped = space.call_function(
+            space.w_type, space.wrap("Clamped"),
+            space.newtuple([self.w_DecimalException]),
+            space.newdict())
+        self.w_Rounded = space.call_function(
+            space.w_type, space.wrap("Rounded"),
+            space.newtuple([self.w_DecimalException]),
+            space.newdict())
+        self.w_Inexact = space.call_function(
+            space.w_type, space.wrap("Inexact"),
+            space.newtuple([self.w_DecimalException]),
+            space.newdict())
+        self.w_Subnormal = space.call_function(
+            space.w_type, space.wrap("Subnormal"),
+            space.newtuple([self.w_DecimalException]),
+            space.newdict())
+        self.w_Underflow = space.call_function(
+            space.w_type, space.wrap("Underflow"),
+            space.newtuple([self.w_Inexact,
+                            self.w_Rounded,
+                            self.w_Subnormal]),
+            space.newdict())
+        self.w_Overflow = space.call_function(
+            space.w_type, space.wrap("Overflow"),
+            space.newtuple([self.w_Inexact,
+                            self.w_Rounded]),
+            space.newdict())
+        self.w_DivisionByZero = space.call_function(
+            space.w_type, space.wrap("DivisionByZero"),
+            space.newtuple([self.w_DecimalException,
+                            space.w_ZeroDivisionError]),
+            space.newdict())
+        self.w_InvalidOperation = space.call_function(
+            space.w_type, space.wrap("InvalidOperation"),
+            space.newtuple([self.w_DecimalException]),
+            space.newdict())
+        self.w_FloatOperation = space.call_function(
+            space.w_type, space.wrap("FloatOperation"),
+            space.newtuple([self.w_DecimalException,
+                            space.w_TypeError]),
+            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
@@ -16,3 +16,13 @@
         assert type(flags).__name__ == 'SignalDict'
         bases = type(flags).__bases__
         assert bases[1] is MutableMapping
+
+    def test_exceptions(self):
+        import _decimal
+        for name in ('Clamped', 'Rounded', 'Inexact', 'Subnormal',
+                     'Underflow', 'Overflow', 'DivisionByZero',
+                     'InvalidOperation', 'FloatOperation'):
+            ex = getattr(_decimal, name)
+            assert issubclass(ex, _decimal.DecimalException)
+            assert issubclass(ex, ArithmeticError)
+


More information about the pypy-commit mailing list