On 3 October 2010 03:13, Henrik Sperre Johansen <henrik.s.johansen@veloxit.no> wrote:
 On 02.10.2010 19:01, Igor Stasenko wrote:
On 2 October 2010 19:47, Stéphane Ducasse<stephane.ducasse@inria.fr>  wrote:
Hi igor
do you understand why the previous definition was
cachedDefinitions     Definitions ifNil: [Definitions := WeakIdentityKeyDictionary new.  WeakArray addWeakDependent: Definitions].     ^ Definitions
i don't. :)
It just a way to free memory as fast as possible. But its really not worth spending so much CPU in order to save few bytes of memory.
Without registering the dict for finalization, the values won't ever be removed with the current implementation.
They are removed. After each package load/unload operation. I don't see a reason to do this more often.
Which can be somewhat hampering to performance once you have lots of nil-keyed elements all stashed from index 1 and onwards after a rehash.
In Pharo, weak dict knows how to reuse expired associations: 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 element | key isNil ifTrue:[^anObject]. index := self scanForEmpty: key. "There should always be room." index = 0 ifTrue: [ self error: 'No space left in dictionary' ]. element := array at: index. element == nil ifTrue: [self atNewIndex: index put: (WeakKeyAssociation key: key value: anObject)] ifFalse: [ element expired ifTrue: [ tally := tally + 1]. element key: key. element value: anObject. self fullCheck. ]. ^ anObject
Cheers, Henry
_______________________________________________ Pharo-project mailing list Pharo-project@lists.gforge.inria.fr http://lists.gforge.inria.fr/cgi-bin/mailman/listinfo/pharo-project
-- Best regards, Igor Stasenko AKA sig.