Hi Dr. Dias,

a WeakValueDictionary get's its values collected if they are not referenced
strongly. However, the association remains there. This means that when you
do:

dictionary := WeakValueDictionary with: 'hello' -> nil copy.

You'll have something like this:

WeakValueDictionary {
  WeakValueAssociation { key: 'hello', value: yourObject }
}

Once you garbage collect, the value is holding yourObject weakly, so you'll
have:

WeakValueDictionary {
  WeakValueAssociation { key: 'hello', value: nil }
}

But the WeakValueAssociation will still be there.

Apparently, what you want to do is to automatically clean your dictionary.
Checking a Pharo60371, I see that WeakValueDictionaries do not implement
this... But WeakKeyDictionary does.

Take for example a look at WeakKeyDictionary>>finalizeValues. If you
subscribe the WeakKeyDictionary instance to the WeakRegistry, the weak
registry will send finalize values to your weak key dictionary and they
will eliminate the expired associations. However, #finalizeValues is not
implemented in WeakValueDictionary. Maybe we should?

Or maybe you should try with Ephemerons.

Guille

BTW why are you using a copy of nil? you can test it with a plain new
Object (i.e., Object new). It took me a couple of extra seconds to realize
what you were doing.

On Tue, Feb 21, 2017 at 7:57 AM, p...@highoctane.be <p...@highoctane.be>
wrote:

> This makes sense, no?
>
> | dictionary |
> dictionary := WeakValueDictionary with: 'hello' -> nil copy.
> "Smalltalk garbageCollect."
> r:={
> dictionary values includes: nil.
> dictionary at: 'hello'.
> dictionary at: 'hello' ifAbsent: [ 'absent' ].
> dictionary at: 'hello' ifAbsentPut: [ 'put' ].
> }.
> r
>
> and I get this anyway when GCing and puttting #x as value
>
> [image: Inline image 1]
>
> Maybe checking for emptiness first is needed before going for values
> include:
>
> Phil
>
>
> On Mon, Feb 20, 2017 at 11:18 PM, Martin Dias <tinchod...@gmail.com>
> wrote:
>
>> Hi. The answer of:
>>
>> | dictionary |
>> dictionary := WeakValueDictionary with: 'hello' -> 'world' copy.
>> Smalltalk garbageCollect.
>> {
>> dictionary values includes: nil.
>> dictionary at: 'hello'.
>> dictionary at: 'hello' ifAbsent: [ 'absent' ].
>> dictionary at: 'hello' ifAbsentPut: [ 'put' ].
>> }
>>
>> is:
>>
>> #(true nil nil nil)
>>
>>
>> Bug or feature? shouldn't the value be considered as absent instead of
>> present (and nil).
>>
>> cheers,
>> Martín
>>
>
>

Reply via email to