#Issue 6795: Fix infinite recursion in long(Decimal('nan')); change int(Decimal('nan')) to raise ValueError instead of either returning NaN or raising InvalidContext.
diff --git a/Lib/decimal.py b/Lib/decimal.py
index 1f5c920..a87a4a5 100644
--- a/Lib/decimal.py
+++ b/Lib/decimal.py
@@ -1555,10 +1555,9 @@
"""Converts self to an int, truncating if necessary."""
if self._is_special:
if self._isnan():
- context = getcontext()
- return context._raise_error(InvalidContext)
+ raise ValueError("Cannot convert NaN to integer")
elif self._isinfinity():
- raise OverflowError("Cannot convert infinity to int")
+ raise OverflowError("Cannot convert infinity to integer")
s = (-1)**self._sign
if self._exp >= 0:
return s*int(self._int)*10**self._exp
diff --git a/Lib/test/test_decimal.py b/Lib/test/test_decimal.py
index f7f023d..50a855e 100644
--- a/Lib/test/test_decimal.py
+++ b/Lib/test/test_decimal.py
@@ -1489,6 +1489,16 @@
r = d.to_integral(ROUND_DOWN)
self.assertEqual(Decimal(int(d)), r)
+ self.assertRaises(ValueError, int, Decimal('-nan'))
+ self.assertRaises(ValueError, int, Decimal('snan'))
+ self.assertRaises(OverflowError, int, Decimal('inf'))
+ self.assertRaises(OverflowError, int, Decimal('-inf'))
+
+ self.assertRaises(ValueError, long, Decimal('-nan'))
+ self.assertRaises(ValueError, long, Decimal('snan'))
+ self.assertRaises(OverflowError, long, Decimal('inf'))
+ self.assertRaises(OverflowError, long, Decimal('-inf'))
+
def test_trunc(self):
for x in range(-250, 250):
s = '%0.2f' % (x / 100.0)