]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Merged revisions 68908 via svnmerge from
authorMark Dickinson <dickinsm@gmail.com>
Sat, 24 Jan 2009 21:47:45 +0000 (21:47 +0000)
committerMark Dickinson <dickinsm@gmail.com>
Sat, 24 Jan 2009 21:47:45 +0000 (21:47 +0000)
svn+ssh://pythondev@svn.python.org/python/branches/py3k

................
  r68908 | mark.dickinson | 2009-01-24 21:46:33 +0000 (Sat, 24 Jan 2009) | 15 lines

  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.
  ........
................

Lib/pickletools.py
Lib/test/pickletester.py
Misc/NEWS
Modules/_pickle.c

index 6614df718a2199f5bbec9de883adcc3ceb867c1f..cfd5fccb98b53ec35281182071d2effe79f6e487 100644 (file)
@@ -2128,11 +2128,11 @@ highest protocol among opcodes = 1
 
 Exercise the INST/OBJ/BUILD family.
 
->>> import random
->>> dis(pickle.dumps(random.getrandbits, 0))
-    0: c    GLOBAL     'random getrandbits'
-   20: p    PUT        0
-   23: .    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
index 4cebcd7bbc9f4315f22c01a6088ba73148537d5d..770e631e8bec0d1379dd15ccb2afa23d4c047802 100644 (file)
@@ -545,6 +545,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 with proto 0
index 673079a1e2ed4eaa23cdbb732450fbb7307c2b6d..e79f1f8dda078a9d92eec0ed118a84f3906764b9 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -100,6 +100,9 @@ Core and Builtins
 Library
 -------
 
+- Issue #1672332: fix unpickling of subnormal floats, which was
+  producing a ValueError on some platforms.
+
 - Issue #3881: Help Tcl to load even when started through the
   unreadable local symlink to "Program Files" on Vista.
 
index 02a3e447d9072c392396eeea2e13634c7e272b5f..63ace099751a3c4c4c2c45cb82209b1c7d90d4ad 100644 (file)
@@ -2969,7 +2969,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");
         return -1;
     }