From: Tim Peters <tim.peters@gmail.com>
Date: Tue, 28 Aug 2001 22:21:18 +0000 (+0000)
Subject: pickle.py, load_int():  Match cPickle's just-repaired ability to unpickle
X-Git-Tag: v2.2a3~268
X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=19ef62d5a98111df15400db22d18a3a555f5f1ff;p=python

pickle.py, load_int():  Match cPickle's just-repaired ability to unpickle
64-bit INTs on 32-bit boxes (where they become longs).  Also exploit that
int(str) and long(str) will ignore a trailing newline (saves creating a
new string at the Python level).

pickletester.py:  Simulate reading a pickle produced by a 64-bit box.
---

diff --git a/Lib/pickle.py b/Lib/pickle.py
index 8be7a8d362..d5773e24c7 100644
--- a/Lib/pickle.py
+++ b/Lib/pickle.py
@@ -615,7 +615,11 @@ class Unpickler:
     dispatch[NONE] = load_none
 
     def load_int(self):
-        self.append(int(self.readline()[:-1]))
+        data = self.readline()
+        try:
+            self.append(int(data))
+        except ValueError:
+            self.append(long(data))
     dispatch[INT] = load_int
 
     def load_binint(self):
diff --git a/Lib/test/pickletester.py b/Lib/test/pickletester.py
index fa3fb89d33..fa3ddf43ad 100644
--- a/Lib/test/pickletester.py
+++ b/Lib/test/pickletester.py
@@ -221,3 +221,18 @@ def dotest(pickle):
                                      repr(s),
                                      got))
         n = n >> 1
+
+    # Fake a pickle from a sizeof(long)==8 box.
+    maxint64 = (1L << 63) - 1
+    data = 'I' + str(maxint64) + '\n.'
+    got = pickle.loads(data)
+    if maxint64 != got:
+        raise TestFailed("maxint64 test failed %r %r" % (maxint64, got))
+    # Try too with a bogus literal.
+    data = 'I' + str(maxint64) + 'JUNK\n.'
+    try:
+        got = pickle.loads(data)
+    except ValueError:
+        pass
+    else:
+        raise TestFailed("should have raised error on bogus INT literal")