[Python-checkins] cpython: Issue #15882: Change _decimal to accept any coefficient tuple when
stefan.krah
python-checkins at python.org
Mon Sep 10 19:42:06 CEST 2012
http://hg.python.org/cpython/rev/97e53273f423
changeset: 78970:97e53273f423
user: Stefan Krah <skrah at bytereef.org>
date: Mon Sep 10 19:34:58 2012 +0200
summary:
Issue #15882: Change _decimal to accept any coefficient tuple when
constructing infinities. This is done for backwards compatibility
with decimal.py: Infinity coefficients are undefined in _decimal
(in accordance with the specification).
files:
Lib/test/test_decimal.py | 17 ++++++++++-------
Misc/NEWS | 4 ++++
Modules/_decimal/_decimal.c | 7 +++++++
3 files changed, 21 insertions(+), 7 deletions(-)
diff --git a/Lib/test/test_decimal.py b/Lib/test/test_decimal.py
--- a/Lib/test/test_decimal.py
+++ b/Lib/test/test_decimal.py
@@ -1992,7 +1992,8 @@
d = Decimal("-4.34913534E-17")
self.assertEqual(d.as_tuple(), (1, (4, 3, 4, 9, 1, 3, 5, 3, 4), -25) )
- # XXX non-compliant infinity payload.
+ # The '0' coefficient is implementation specific to decimal.py.
+ # It has no meaning in the C-version and is ignored there.
d = Decimal("Infinity")
self.assertEqual(d.as_tuple(), (0, (0,), 'F') )
@@ -2012,12 +2013,14 @@
d = Decimal( (1, (), 'n') )
self.assertEqual(d.as_tuple(), (1, (), 'n') )
- # XXX coefficient in infinity should raise an error
- if self.decimal == P:
- d = Decimal( (0, (4, 5, 3, 4), 'F') )
- self.assertEqual(d.as_tuple(), (0, (0,), 'F'))
- d = Decimal( (1, (0, 2, 7, 1), 'F') )
- self.assertEqual(d.as_tuple(), (1, (0,), 'F'))
+ # For infinities, decimal.py has always silently accepted any
+ # coefficient tuple.
+ d = Decimal( (0, (0,), 'F') )
+ self.assertEqual(d.as_tuple(), (0, (0,), 'F'))
+ d = Decimal( (0, (4, 5, 3, 4), 'F') )
+ self.assertEqual(d.as_tuple(), (0, (0,), 'F'))
+ d = Decimal( (1, (0, 2, 7, 1), 'F') )
+ self.assertEqual(d.as_tuple(), (1, (0,), 'F'))
def test_subclassing(self):
# Different behaviours when subclassing Decimal
diff --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -21,6 +21,10 @@
Library
-------
+- Issue #15882: Change _decimal to accept any coefficient tuple when
+ constructing infinities. This is done for backwards compatibility
+ with decimal.py: Infinity coefficients are undefined in _decimal
+ (in accordance with the specification).
- Issue #15876: Fix a refleak in the curses module: window.encoding.
diff --git a/Modules/_decimal/_decimal.c b/Modules/_decimal/_decimal.c
--- a/Modules/_decimal/_decimal.c
+++ b/Modules/_decimal/_decimal.c
@@ -2364,6 +2364,7 @@
long sign, l;
mpd_ssize_t exp = 0;
Py_ssize_t i, mem, tsize;
+ int is_infinite = 0;
int n;
assert(PyTuple_Check(dectuple));
@@ -2399,6 +2400,7 @@
/* special */
if (PyUnicode_CompareWithASCIIString(tmp, "F") == 0) {
strcat(sign_special, "Inf");
+ is_infinite = 1;
}
else if (PyUnicode_CompareWithASCIIString(tmp, "n") == 0) {
strcat(sign_special, "NaN");
@@ -2470,6 +2472,11 @@
"coefficient must be a tuple of digits");
goto error;
}
+ if (is_infinite) {
+ /* accept but ignore any well-formed coefficient for compatibility
+ with decimal.py */
+ continue;
+ }
*cp++ = (char)l + '0';
}
*cp = '\0';
--
Repository URL: http://hg.python.org/cpython
More information about the Python-checkins
mailing list