[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