summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Dickinson <dickinsm@gmail.com>2009-01-24 21:30:14 +0000
committerMark Dickinson <dickinsm@gmail.com>2009-01-24 21:30:14 +0000
commit3df16920eb7fe8e3e4b571efb50571b697600c2c (patch)
tree5608486e2d6bfc5b1908d5e0d04304e75113d0f8
parent42f612a19b784ecc874e98cb657e1cc01d8f75f7 (diff)
downloadcpython-git-3df16920eb7fe8e3e4b571efb50571b697600c2c.tar.gz
Merged revisions 68903,68906 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk ........ r68903 | mark.dickinson | 2009-01-24 16:40:29 +0000 (Sat, 24 Jan 2009) | 5 lines Issue #1672332: Fix unpickling of subnormal floats, which was raising ValueError on some platforms as a result of the platform strtod setting errno on underflow. ........ r68906 | mark.dickinson | 2009-01-24 21:08:38 +0000 (Sat, 24 Jan 2009) | 2 lines Issue #3657: fix occasional test_pickletools failures. ........
-rw-r--r--Lib/pickletools.py10
-rw-r--r--Lib/test/pickletester.py10
-rw-r--r--Misc/NEWS3
-rw-r--r--Modules/cPickle.c3
4 files changed, 20 insertions, 6 deletions
diff --git a/Lib/pickletools.py b/Lib/pickletools.py
index ae02a36103..7121c2a09a 100644
--- a/Lib/pickletools.py
+++ b/Lib/pickletools.py
@@ -2083,11 +2083,11 @@ highest protocol among opcodes = 1
Exercise the INST/OBJ/BUILD family.
->>> import random
->>> dis(pickle.dumps(random.random, 0))
- 0: c GLOBAL 'random random'
- 15: p PUT 0
- 18: . STOP
+>>> import pickletools
+>>> dis(pickle.dumps(pickletools.dis, 0))
+ 0: c GLOBAL 'pickletools dis'
+ 17: p PUT 0
+ 20: . STOP
highest protocol among opcodes = 0
>>> from pickletools import _Example
diff --git a/Lib/test/pickletester.py b/Lib/test/pickletester.py
index bd0a3a4813..e34d55b85d 100644
--- a/Lib/test/pickletester.py
+++ b/Lib/test/pickletester.py
@@ -535,6 +535,16 @@ class AbstractPickleTests(unittest.TestCase):
got = self.loads(p)
self.assertEqual(n, got)
+ def test_float(self):
+ test_values = [0.0, 4.94e-324, 1e-310, 7e-308, 6.626e-34, 0.1, 0.5,
+ 3.14, 263.44582062374053, 6.022e23, 1e30]
+ test_values = test_values + [-x for x in test_values]
+ for proto in protocols:
+ for value in test_values:
+ pickle = self.dumps(value, proto)
+ got = self.loads(pickle)
+ self.assertEqual(value, got)
+
@run_with_locale('LC_ALL', 'de_DE', 'fr_FR')
def test_float_format(self):
# make sure that floats are formatted locale independent
diff --git a/Misc/NEWS b/Misc/NEWS
index 159f00ae77..237fb50f38 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -194,6 +194,9 @@ Core and Builtins
Library
-------
+- Issue #1672332: fix unpickling of subnormal floats, which was
+ producing a ValueError on some platforms.
+
- Restore Python 2.3 compatibility for decimal.py.
- Issue #1702551: distutils sdist was not excluding VCS directories under
diff --git a/Modules/cPickle.c b/Modules/cPickle.c
index 7f836c3126..fb13ba18bc 100644
--- a/Modules/cPickle.c
+++ b/Modules/cPickle.c
@@ -3465,7 +3465,8 @@ load_float(Unpicklerobject *self)
errno = 0;
d = PyOS_ascii_strtod(s, &endptr);
- if (errno || (endptr[0] != '\n') || (endptr[1] != '\0')) {
+ if ((errno == ERANGE && !(fabs(d) <= 1.0)) ||
+ (endptr[0] != '\n') || (endptr[1] != '\0')) {
PyErr_SetString(PyExc_ValueError,
"could not convert string to float");
goto finally;