summaryrefslogtreecommitdiff
path: root/Lib/weakref.py
diff options
context:
space:
mode:
authorTim Peters <tim.peters@gmail.com>2003-05-25 01:45:11 +0000
committerTim Peters <tim.peters@gmail.com>2003-05-25 01:45:11 +0000
commitc67e258ba7016cb3a5b1fb991cdd2e5e6d8f4a0a (patch)
treea4162bc25f4246054ca1717912842adb828f1d76 /Lib/weakref.py
parent222915ba6f226d4140d8de9435956f93bd57daec (diff)
downloadcpython-c67e258ba7016cb3a5b1fb991cdd2e5e6d8f4a0a.tar.gz
SF 742860: WeakKeyDictionary __delitem__ uses iterkeys
Someone review this, please! Final releases are getting close, Fred (the weakref guy) won't be around until Tuesday, and the pre-patch code can indeed raise spurious RuntimeErrors in the presence of threads or mutating comparison functions. See the bug report for my confusions: I can't see any reason for why __delitem__ iterated over the keys. The new one-liner implementation is much faster, can't raise RuntimeError, and should be better-behaved in all respects wrt threads. New tests test_weak_keyed_bad_delitem and test_weak_keyed_cascading_deletes fail before this patch. Bugfix candidate for 2.2.3 too, if someone else agrees with this patch.
Diffstat (limited to 'Lib/weakref.py')
-rw-r--r--Lib/weakref.py6
1 files changed, 1 insertions, 5 deletions
diff --git a/Lib/weakref.py b/Lib/weakref.py
index 838ff5ef7a..09bed6560e 100644
--- a/Lib/weakref.py
+++ b/Lib/weakref.py
@@ -164,11 +164,7 @@ class WeakKeyDictionary(UserDict.UserDict):
if dict is not None: self.update(dict)
def __delitem__(self, key):
- for ref in self.data.iterkeys():
- o = ref()
- if o == key:
- del self.data[ref]
- return
+ del self.data[ref(key)]
def __getitem__(self, key):
return self.data[ref(key)]