]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-38006: Avoid closure in weakref.WeakValueDictionary (GH-15641)
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>
Mon, 9 Sep 2019 16:24:16 +0000 (09:24 -0700)
committerGitHub <noreply@github.com>
Mon, 9 Sep 2019 16:24:16 +0000 (09:24 -0700)
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)

Co-authored-by: Victor Stinner <vstinner@redhat.com>
Lib/test/test_weakref.py
Lib/weakref.py
Misc/NEWS.d/next/Library/2019-09-02-13-37-27.bpo-38006.Y7vA0Q.rst [new file with mode: 0644]

index 6f15c03ac5292ff663647b52b35dab4b83d8039f..d9e1b201f65676321799aef1e96c48952ed618f2 100644 (file)
@@ -1785,6 +1785,11 @@ class MappingTestCase(TestBase):
         # 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
 
index 8d71af653b7ec4620397149959eb44146ef33ec7..9d7008947f06d40b48a7d736f8231f41af3db409 100644 (file)
@@ -108,12 +108,12 @@ class WeakValueDictionary(_collections_abc.MutableMapping):
                 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(other, **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 (file)
index 0000000..ff064ad
--- /dev/null
@@ -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.