[Pharo-project] Bug in #pointsTo: ?

Levente Uzonyi leves at elte.hu
Mon Jan 9 13:13:47 EST 2012


On Mon, 9 Jan 2012, Mariano Martinez Peck wrote:

> Hi Levente. Thanks for looking into the issue. I saw your code and there is
> something I don't understand.
>
> pointsTo: anObject
>    "Answers true if the garbage collector would fail to collect anObject
> because I hold a reference to it, or false otherwise"
>
>    (self instVarsInclude: anObject)
>        ifTrue: [
>            self class isWeak ifFalse: [ ^true ].
>            1 to: self class instSize do: [ :i |
>                (self instVarAt: i) == anObject ifTrue: [ ^true ] ].
>            ^false ]
>        ifFalse: [ ^self class == anObject and: [ self class isCompact not
> ] ]
>
>
> I don't understand the loop of
>
>            1 to: self class instSize do: [ :i |
>                (self instVarAt: i) == anObject ifTrue: [ ^true ] ].
>
>
> In which scenario can     (self instVarsInclude: anObject)  answer true,
> but the loop false?

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.

> doesn't #instVarsInclude do exactly what you are doing there?

Just partially. Since we have no information about which slots hold the
reference to the argument, therefore this loop must be "repeated".

>
> Anyway, I have integrated your changes in Pharo, but still, I have the same
> problem :(
> If I understand correctly, the following shouldn't fail, but it does. Here
> is the version of Squeak that fails.

The assetion fails, because the indirection vector (the Array found by 
PointerFinder) holds a reference to the object after the first assignment 
to a. If you move the temporary inside the block or use an inlined loop 
(e.g. #to:do: with literal block argument), then the assertion won't fail. 
So this is just a normal (maybe surprising) reference to the object.


Levente

>
> | a |
> 10 timesRepeat: [
> a := Date new.
> Smalltalk garbageCollect.
> self assert: (PointerFinder pointersTo: a) isEmpty
> ]
>
> Thanks a lot,
>
>
> On Mon, Jan 9, 2012 at 2:40 PM, Levente Uzonyi <leves at elte.hu> wrote:
>
> On Sun, 8 Jan 2012, Mariano Martinez Peck wrote:
>>
>>  What I don't understand is why in Squeak it does work.
>>>>
>>>>>
>>>>>
>>>> Because #pointsTo: is not used in Squeak (yet). As usual I dug deeper
>>>> than
>>>> I should have, so I'll publish a few changes soon.
>>>>
>>>>
>>>>  Ok, you are right. Squeak #inboundPointersExcluding:  is using
>>> #instVarsInclude:  rather than #pointsTo. And that solves the problem in
>>> Pharo as well. But still, I would like to understand why we get those
>>> method contexts with #pointsTo.
>>>
>>
>> Because #pointsTo: is a normal message send, it even sends other methods,
>> so it will create contexts.
>>
>>
>>  Thanks Levente for your help. If you find something let us know, I want to
>>> learn :)
>>>
>>
>> I pushed my changes to the Squeak Inbox, which fully works around this
>> issue. The changes about weak references can simply be removed if you don't
>> like them, the rest will just work without them.
>>
>>
>> Levente
>>
>>
>>> Thanks
>>>
>>>
>>>
>>>> Levente
>>>>
>>>>
>>>>  Thanks in advance Levente!
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>  it will create at least one new MethodContext which is not included in
>>>>>
>>>>>> that list.
>>>>>>
>>>>>>
>>>>>> Levente
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>  Levente
>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>  Thanks again.
>>>>>>>>
>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>  Levente
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>  Do you mean what I understand :)? that some tools compiled
>>>>>>>>>> methods?
>>>>>>>>>> :)
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>  Stef
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>>  --
>>>>>>>>>>>>
>>>>>>>>>>>>  Mariano
>>>>>>>>>>> http://marianopeck.wordpress.**********com <
>>>>>>>>>>> http://marianopeck.wordpress.
>>>>>>>>>>> ****
>>>>>>>>>>> com <http://marianopeck.wordpress.******com<http://marianopeck.**
>>>>>>>>>>> wordpress.com <http://marianopeck.wordpress.**com<http://marianopeck.wordpress.com>
>>>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>   --
>>>>>>>>>>
>>>>>>>>> Mariano
>>>>>>>>> http://marianopeck.wordpress.********com <
>>>>>>>>> http://marianopeck.wordpress.
>>>>>>>>> ****
>>>>>>>>> com <http://marianopeck.wordpress.****com<http://marianopeck.**
>>>>>>>>> wordpress.com <http://marianopeck.wordpress.com>>
>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>  --
>>>>>>> Mariano
>>>>>>> http://marianopeck.wordpress.******com <http://marianopeck.wordpress.
>>>>>>> ****
>>>>>>> com <http://marianopeck.wordpress.**com<http://marianopeck.wordpress.com>
>>>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>
>>>>> --
>>>>> Mariano
>>>>> http://marianopeck.wordpress.****com <http://marianopeck.wordpress.**
>>>>> com <http://marianopeck.wordpress.com>>
>>>>>
>>>>>
>>>>>
>>>>
>>>
>>> --
>>> Mariano
>>> http://marianopeck.wordpress.**com <http://marianopeck.wordpress.com>
>>>
>>>
>>
>
>
> -- 
> Mariano
> http://marianopeck.wordpress.com
>




More information about the Pharo-dev mailing list