[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