On Mon, Jan 9, 2012 at 12:47 PM, Eliot Miranda <eliot.mira...@gmail.com>wrote:

>
>
> On Mon, Jan 9, 2012 at 12:38 PM, Henrik Johansen <
> henrik.s.johan...@veloxit.no> wrote:
>
>>
>> On Jan 9, 2012, at 8:46 06PM, Levente Uzonyi wrote:
>>
>> > On Mon, 9 Jan 2012, Mariano Martinez Peck wrote:
>> >
>> >>>
>> >>>>>
>> >>>>> So..I am puzzle again. I said "In which scenario can     (self
>> >>>> instVarsInclude: anObject)  answer true, but the loop false? "
>> >>>> you answered: "The scenario happens when the receiver has weak slots
>> and
>> >>>> the argument is referenced from one of those weak slots, but not
>> from the
>> >>>> other slots."
>> >>>> Imagine the receiver has a weak slot XXX that points to anObject. So
>> (self
>> >>>> instVarsInclude: anObject) answers true.   How can the loop answer
>> false
>> >>>> without a GC?
>> >>>> why would XXX stop pointing to anObject if there is not GC in the
>> middle ?
>> >>>>
>> >>>
>> >>> The loop doesn't iterate over the indexable slots, only named ones.
>> >>>
>> >>>
>> >> grrr you are right!
>> >>
>> >> Ok, so I finally got it. So previously pointersTo: would answer true
>> even
>> >> if the slots were weak. Now it would answer false, and that's why you
>> have
>> >> changed the method comment.
>> >> Now I am thinking if this should be the default behavior of
>> #pointsTo:. If
>> >> I just read the selector #pointsTo:  I would guess weak references are
>> also
>> >> taken into account.  So that's why I am not completely sure. Aren't
>> there
>> >> any other impact of the system because of this change?
>> >> what about having #stronglyPointsTo: with this new version and have
>> another
>> >> one #pointsTo: which considers weak also?
>> >> does it make sense?  or it is better to directly avoid weak by defualt
>> in
>> >> #pointsTo?
>> >
>> > I wasn't sure about this, that's why it's not in Squeak yet. Ignoring
>> weak references is okay as long as these methods are only used for pointer
>> tracing.
>> >
>> >
>> > Levente
>>
>> Even with a good comment, the naming starts to make little sense, imho…
>> Does an object having weak slots mean it no longer pointsTo: the objects
>> in those slots?
>>
>> Sadly, I have no better succinct suggestions. :/
>>
>> Also, what happens when an object holds its (non-compact) class in a weak
>> slot?
>>
>> In other words, is:
>>
>> wa := WeakArray new: 1.
>> wa at: 1 put: WeakArray.
>> self assert: (wa pointsTo: WeakArray).
>>
>> a valid test?
>>
>
> It is vacuous, since WeakArray is referred to indirectly from the roots
> via Smalltalk and so will not go away.  The following is not a valid test
> because there could be a GC in between the at:put: and the assert:.
>
> | o oh |
> wa := WeakArray new: 1.
> o := Object new.
> oh := o hash.
> wa at: 1 put: o.
> o := nil.
> self assert: (wa at: 1) hash = oh
>
> but 99 times out of a hundred it'll pass :)
>

and it can better be written

| oh |
wa := WeakArray new: 1.
oh := (wa at: 1 put: Object new) hash.
self assert: (wa at: 1) hash = oh


> Weak arrays are tricky beasts.  To me, it doesn't matter that when used on
> WeakArray pointsTo: or instVarsIncludes: or whatever produce results that
> may be invalid at some subsequent time.  The same is true for e.g. a normal
> Array that could be updated in some other thread.  It does mater that at
> the point when an inst var is queried these methods/primitives answer the
> right answer.  Writing valid tests that verify these answers is another
> matter entirely.  Don't let the perfect be the enemy of the good.
>
>
>>
>> Cheers,
>> Henry
>>
>
>
>
> --
> best,
> Eliot
>
>


-- 
best,
Eliot

Reply via email to