Dictionaries broken in 3.9a

stéphane ducasse ducasse at iam.unibe.ch
Sun Sep 18 10:29:31 UTC 2005


Ok here is the reason


Name: Collections-md.18
Author: md
Time: 7 August 2005, 3:26:12 pm
UUID: 2d15dd50-ce8c-43d6-9f4e-4bd108c2af7d
Ancestors: Collections-md.17

Change Set:        WeakKeyDictionaryNilsFix
Date:            5 December 2004
Author:            Chris Muller

fixes this bug

Subject:        [BUG] WeakKeyDictionary>>keysAndValuesDo:
Author:        Chris Muller
Date Posted: 8 June 2004
Archive ID: 22746
Comments:
The following code demonstrates that keysAndValuesDo: will evaluate  
nil keys
that have been gc'd.

     | d |
     d _ WeakIdentityKeyDictionary new
         at: 'hello' copy put: nil;
         yourself.
     Smalltalk garbageCollectMost.
     d keysAndValuesDo: [ : k : v | k ifNil: [ self halt ] ]

I consider this a bug because it contradicts the notion that nil  
cannot be a
key in a Dictionary.  Incidentally, keysDo: passes the test.


Dictionary>>at: key put: anObject
     "Set the value at key to be anObject.  If key is not found,  
create a
     new entry for key and set is value to anObject. Answer anObject."

     | index assoc |
     key ifNil: [ self error: 'Dictionaries cannot meaningfully key  
by nil.' ].
     index _ self findElementOrNil: key.
     assoc _ array at: index.
     assoc
         ifNil: [self atNewIndex: index put: (Association key: key  
value: anObject)]
         ifNotNil: [assoc value: anObject].
     ^ anObject



WeakKeyDictionary>>associationsDo: aBlock
     "Evaluate aBlock for each of the receiver's elements (key/value
     associations)."

     super associationsDo:
         [ : eachAssoc |  | eachKey |
         eachKey _ eachAssoc key.  "reference to ensure no GC"
         eachKey ifNotNil: [ aBlock value: eachAssoc ] ]




More information about the Squeak-dev mailing list