diff options
author | Carl Friedrich Bolz-Tereick <cfbolz@gmx.de> | 2021-04-23 21:27:14 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-04-23 21:27:14 (GMT) |
commit | 1e9f0933095403b215c2c4a0be7915d034ff7026 (patch) | |
tree | 3e243c4244ac286f67c62ef23f913da769975acb | |
parent | f24e2e5464ba6498e7b8d73c3f9b417d59fd1b26 (diff) | |
download | cpython-1e9f0933095403b215c2c4a0be7915d034ff7026.zip cpython-1e9f0933095403b215c2c4a0be7915d034ff7026.tar.gz cpython-1e9f0933095403b215c2c4a0be7915d034ff7026.tar.bz2 |
bpo-43907: add missing memoize call in pure python pickling of bytearray (GH-25501)
-rw-r--r-- | Lib/pickle.py | 1 | ||||
-rw-r--r-- | Lib/test/pickletester.py | 8 | ||||
-rw-r--r-- | Misc/NEWS.d/next/Library/2021-04-23-20-57-20.bpo-43907.3RJEjv.rst | 4 |
3 files changed, 13 insertions, 0 deletions
diff --git a/Lib/pickle.py b/Lib/pickle.py index e63a8b6..5ab312f 100644 --- a/Lib/pickle.py +++ b/Lib/pickle.py @@ -818,6 +818,7 @@ class _Pickler: self._write_large_bytes(BYTEARRAY8 + pack("<Q", n), obj) else: self.write(BYTEARRAY8 + pack("<Q", n) + obj) + self.memoize(obj) dispatch[bytearray] = save_bytearray if _HAVE_PICKLE_BUFFER: diff --git a/Lib/test/pickletester.py b/Lib/test/pickletester.py index fd05e7a..8e01d31 100644 --- a/Lib/test/pickletester.py +++ b/Lib/test/pickletester.py @@ -1853,6 +1853,14 @@ class AbstractPickleTests(unittest.TestCase): self.assertNotIn(b'bytearray', p) self.assertTrue(opcode_in_pickle(pickle.BYTEARRAY8, p)) + def test_bytearray_memoization_bug(self): + for proto in protocols: + for s in b'', b'xyz', b'xyz'*100: + b = bytearray(s) + p = self.dumps((b, b), proto) + b1, b2 = self.loads(p) + self.assertIs(b1, b2) + def test_ints(self): for proto in protocols: n = sys.maxsize diff --git a/Misc/NEWS.d/next/Library/2021-04-23-20-57-20.bpo-43907.3RJEjv.rst b/Misc/NEWS.d/next/Library/2021-04-23-20-57-20.bpo-43907.3RJEjv.rst new file mode 100644 index 0000000..7da3a1c --- /dev/null +++ b/Misc/NEWS.d/next/Library/2021-04-23-20-57-20.bpo-43907.3RJEjv.rst @@ -0,0 +1,4 @@ +Fix a bug in the pure-Python pickle implementation when using protocol 5, +where bytearray instances that occur several time in the pickled object +graph would incorrectly unpickle into repeated copies of the bytearray +object. |