diff options
author | Pierre Glaser <pierreglaser@msn.com> | 2020-02-02 18:55:21 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-02-02 18:55:21 (GMT) |
commit | 0f2f35e15f9fbee44ce042b724348419d8136bc5 (patch) | |
tree | 5e97ddf0e6fa7b08990923bd77c22623a4779a80 /Lib | |
parent | 339fd46cb764277cbbdc3e78dcc5b45b156bb6ae (diff) | |
download | cpython-0f2f35e15f9fbee44ce042b724348419d8136bc5.zip cpython-0f2f35e15f9fbee44ce042b724348419d8136bc5.tar.gz cpython-0f2f35e15f9fbee44ce042b724348419d8136bc5.tar.bz2 |
bpo-39492: Fix a reference cycle between reducer_override and a Pickler instance (GH-18266)
This also needs a backport to 3.8
https://bugs.python.org/issue39492
Automerge-Triggered-By: @pitrou
Diffstat (limited to 'Lib')
-rw-r--r-- | Lib/test/pickletester.py | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/Lib/test/pickletester.py b/Lib/test/pickletester.py index 953fd5c..ba893f3 100644 --- a/Lib/test/pickletester.py +++ b/Lib/test/pickletester.py @@ -3499,6 +3499,30 @@ class AbstractHookTests(unittest.TestCase): ValueError, 'The reducer just failed'): p.dump(h) + @support.cpython_only + def test_reducer_override_no_reference_cycle(self): + # bpo-39492: reducer_override used to induce a spurious reference cycle + # inside the Pickler object, that could prevent all serialized objects + # from being garbage-collected without explicity invoking gc.collect. + + for proto in range(0, pickle.HIGHEST_PROTOCOL + 1): + with self.subTest(proto=proto): + def f(): + pass + + wr = weakref.ref(f) + + bio = io.BytesIO() + p = self.pickler_class(bio, proto) + p.dump(f) + new_f = pickle.loads(bio.getvalue()) + assert new_f == 5 + + del p + del f + + self.assertIsNone(wr()) + class AbstractDispatchTableTests(unittest.TestCase): |