[Python-checkins] python/dist/src/Lib weakref.py,1.15.8.1,1.15.8.2

bwarsaw@users.sourceforge.net bwarsaw@users.sourceforge.net
Wed, 28 May 2003 16:03:32 -0700


Update of /cvsroot/python/python/dist/src/Lib
In directory sc8-pr-cvs1:/tmp/cvs-serv30946/Lib

Modified Files:
      Tag: release22-maint
	weakref.py 
Log Message:
The backport gets Fred's seal of approval:

    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.

Backported the tests and the patch.


Index: weakref.py
===================================================================
RCS file: /cvsroot/python/python/dist/src/Lib/weakref.py,v
retrieving revision 1.15.8.1
retrieving revision 1.15.8.2
diff -C2 -d -r1.15.8.1 -r1.15.8.2
*** weakref.py	23 Aug 2002 16:29:01 -0000	1.15.8.1
--- weakref.py	28 May 2003 23:03:29 -0000	1.15.8.2
***************
*** 153,161 ****
  
      def __delitem__(self, key):
!         for ref in self.data.iterkeys():
!             o = ref()
!             if o == key:
!                 del self.data[ref]
!                 return
  
      def __getitem__(self, key):
--- 153,157 ----
  
      def __delitem__(self, key):
!         del self.data[ref(key)]
  
      def __getitem__(self, key):