From: Tim Peters 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")