From: Antoine Pitrou Date: Sat, 13 Aug 2011 18:15:19 +0000 (+0200) Subject: Issue #12744: Fix inefficient representation of integers X-Git-Tag: v3.3.0a1~1698 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=3c7e928098d874d82f1069fca640d20afca84c02;p=thirdparty%2FPython%2Fcpython.git Issue #12744: Fix inefficient representation of integers between 2**31 and 2**63 on systems with a 64-bit C "long". --- diff --git a/Lib/test/pickletester.py b/Lib/test/pickletester.py index f90d34823d42..ad15fe8ecd40 100644 --- a/Lib/test/pickletester.py +++ b/Lib/test/pickletester.py @@ -1118,6 +1118,16 @@ class AbstractPickleTests(unittest.TestCase): empty = self.loads(b'\x80\x03U\x00q\x00.', encoding='koi8-r') self.assertEqual(empty, '') + def test_int_pickling_efficiency(self): + # Test compacity of int representation (see issue #12744) + for proto in protocols: + sizes = [len(self.dumps(2**n, proto)) for n in range(70)] + # the size function is monotonous + self.assertEqual(sorted(sizes), sizes) + if proto >= 2: + self.assertLessEqual(sizes[-1], 14) + + # Test classes for reduce_ex class REX_one(object): diff --git a/Misc/NEWS b/Misc/NEWS index 3c137e0506ee..453529dbae98 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -254,6 +254,9 @@ Core and Builtins Library ------- +- Issue #12744: Fix inefficient representation of integers between 2**31 and + 2**63 on systems with a 64-bit C "long". + - Issue #12646: Add an 'eof' attribute to zlib.Decompress, to make it easier to detect truncated input streams. diff --git a/Modules/_pickle.c b/Modules/_pickle.c index f147e3ec3c79..5952c1bf7a31 100644 --- a/Modules/_pickle.c +++ b/Modules/_pickle.c @@ -1540,7 +1540,7 @@ save_long(PicklerObject *self, PyObject *obj) /* out of range for int pickling */ PyErr_Clear(); } - else + else if (val <= 0x7fffffffL && val >= -0x80000000L) return save_int(self, val); if (self->proto >= 2) {