From 6a1af5dcf63ebafda48b3827dc7015bed3f8821f Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Mon, 9 Sep 2019 16:55:58 +0200 Subject: [PATCH] bpo-38006: Avoid closure in weakref.WeakValueDictionary (GH-15641) weakref.WeakValueDictionary defines a local remove() function used as callback for weak references. This function was created with a closure. Modify the implementation to avoid the closure. (cherry picked from commit a2af05a0d3f0da06b8d432f52efa3ecf29038532) --- Lib/test/test_weakref.py | 5 +++++ Lib/weakref.py | 4 ++-- .../next/Library/2019-09-02-13-37-27.bpo-38006.Y7vA0Q.rst | 3 +++ 3 files changed, 10 insertions(+), 2 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2019-09-02-13-37-27.bpo-38006.Y7vA0Q.rst diff --git a/Lib/test/test_weakref.py b/Lib/test/test_weakref.py index ad7a6acfcc7d0b..d3396fc9cf90ce 100644 --- a/Lib/test/test_weakref.py +++ b/Lib/test/test_weakref.py @@ -1770,6 +1770,11 @@ def test_threaded_weak_value_dict_deepcopy(self): # copying should not result in a crash. self.check_threaded_weak_dict_copy(weakref.WeakValueDictionary, True) + @support.cpython_only + def test_remove_closure(self): + d = weakref.WeakValueDictionary() + self.assertIsNone(d._remove.__closure__) + from test import mapping_tests diff --git a/Lib/weakref.py b/Lib/weakref.py index 59b3aa5621a33f..461c997a1293ae 100644 --- a/Lib/weakref.py +++ b/Lib/weakref.py @@ -114,12 +114,12 @@ def remove(wr, selfref=ref(self), _atomic_removal=_remove_dead_weakref): else: # Atomic removal is necessary since this function # can be called asynchronously by the GC - _atomic_removal(d, wr.key) + _atomic_removal(self.data, wr.key) self._remove = remove # A list of keys to be removed self._pending_removals = [] self._iterating = set() - self.data = d = {} + self.data = {} self.update(*args, **kw) def _commit_removals(self): diff --git a/Misc/NEWS.d/next/Library/2019-09-02-13-37-27.bpo-38006.Y7vA0Q.rst b/Misc/NEWS.d/next/Library/2019-09-02-13-37-27.bpo-38006.Y7vA0Q.rst new file mode 100644 index 00000000000000..ff064ad3f1a492 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-09-02-13-37-27.bpo-38006.Y7vA0Q.rst @@ -0,0 +1,3 @@ +weakref.WeakValueDictionary defines a local remove() function used as +callback for weak references. This function was created with a closure. +Modify the implementation to avoid the closure.