Commit a2af05a0 authored by Victor Stinner's avatar Victor Stinner Committed by GitHub

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.
parent b3b48c81
......@@ -1792,6 +1792,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
......
......@@ -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):
......
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.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment