Ok, the problem is the following. Check my screenshot of the previous mail. Left is incorrect, right is correct.
As you can notice, the "correct" CompiledMethod finishes with a bytecode "return self" and number 78. This bytecode is missing in the "incorrect" CM.
And, the first byte in method trailer in the incorrect CM is 120. Guess what?� 16r78 -> 120.� So...the incorrect CM interpret that byte as trailer instead of bytecode.
Now, if you ask to the incorrect CM: "trailer data", you get, of course, 120.
If you see
sourcePointer: ptr
��� self clear.
��� data := ptr.
��� "see if we can encode pointer using 4-byte trailer"
��� kind := (ptr between: 16r1000000 and: 16r4FFFFFF)
��� ��� ifTrue: [ #SourcePointer ] ifFalse: [ #VarLengthSourcePointer ].
You can guess that ptr is 120, hence it sets #VarLengthSourcePointer
Now...two problem bugs:
1) how can these CM be generated????� Compiler bug?
2) where are they kept that I cannot garbage collect them ??
Cheers
Mariano
���
On Mon, May 9, 2011 at 12:48 PM, Igor Stasenko <siguctua@gmail.com> wrote:
the one to the left seems like broken. it not ends with return self.
yes, exactly. That one on the left is the one that� trailer kind answers #VarLengthSourcePointer
the right is the correct one.
You can also notice that the one of the left in addition to not having the last bytecode (self return), it has only 2 bytes for the trailer.
Anyway, regardless of how such CM could have been generated, I CANNOT find who is pointing to them. They appear only in PharoDev and I cannot find any pattern between them :(
:(--On 9 May 2011 11:22, Mariano Martinez Peck <marianopeck@gmail.com> wrote:
>
>
> On Mon, May 9, 2011 at 10:53 AM, Mariano Martinez Peck
> <marianopeck@gmail.com> wrote:
>>
>>
>> On Mon, May 9, 2011 at 10:27 AM, Nicolas Cellier
>> <nicolas.cellier.aka.nice@gmail.com> wrote:
>>>
>>> Hi Mariano,
>>> you should try these two things before repeating yourself:
>>>
>>> (CompiledMethod allInstances select: �[:each | each trailer kind =
>>> #VarLengthSourcePointer] ) first trailer kind.
>>>
>>> | temp |
>>> temp := (CompiledMethod allInstances select: �[:each | each trailer
>>> kind = #VarLengthSourcePointer] ) first.
>>> temp == (temp methodClass >> temp selector)
>>>
>>
>> Thanks Nicolas. Yes,� in fact all of you were right. They are not the same
>> CM instance. They are different.
>> It is wierd that they are only present in Pharo1.3:
>>
>>
>> ((CompiledMethod allInstances select:� [:each | each trailer kind =
>> #VarLengthSourcePointer] ) ) size
>> ->>>�� 11
>>
>> And in Pharo 1.2, cero and and 1.1.1, 2.
>>
>> I am trying to inspect pointers to them to see who is pointing to
>> them...but I cannot find anything :(
>>
>> I will continue....
>>
>
> More data: there are only these kind of compiled methods in the dev image.
> Not in core.
>
> In addition, if I do: ScriptLoader new cleanUpForRelease, then inspect
> ((CompiledMethod allInstances select:� [:each | each trailer kind =
> #VarLengthSourcePointer] ) )
>
> and then I click on the first element in the inspector.... VM CRASH!!!� with
> both, InterpreterVM and CogVM.
>
> I can see the difference in the trailer of the CMs (I attach screenshot),
> but still cannot find who is pointing to that weird instances :(
>
> grrr... thanks for the help
>
>
>
>>
>> thanks
>>
>>
>>
>>> It may be possible that CompiledMethod>>printString is lying to you...
>>>
>>> Nicolas
>>>
>>> 2011/5/9 Mariano Martinez Peck <marianopeck@gmail.com>:
>>> >
>>> >
>>> > On Mon, May 9, 2011 at 6:14 AM, Igor Stasenko <siguctua@gmail.com>
>>> > wrote:
>>> >>
>>> >> On 9 May 2011 00:52, Mariano Martinez Peck <marianopeck@gmail.com>
>>> >> wrote:
>>> >> > Hi guys, Maybe it is too late and I am not seeing something
>>> >> > obvious...so
>>> >> > another look is really appreciated. If I do:
>>> >> >
>>> >> > (CompiledMethod allInstances select:� [:each | each trailer kind =
>>> >> > #VarLengthSourcePointer] ) first
>>> >> > ---> (CodeLoader class>>#initialize "a CompiledMethod(311951360)")
>>> >> >
>>> >> > But then:
>>> >> >
>>> >> > (CodeLoader class >> #initialize) trailer kind
>>> >> > ----> #SourcePointer
>>> >> >
>>> >> > WHYYY??� why it is answering #SourcePointer instead of
>>> >> > #VarLengthSourcePointer� ??
>>> >> >
>>> >> > grrr how can that be possible???� It happens the same to each of the
>>> >> > CompiledMethods I select as #VarLengthSourcePointer.� When I then
>>> >> > ask
>>> >> > the
>>> >> > #kind� they always answer #SourcePointer� instead of
>>> >> > #VarLengthSourcePointer
>>> >> >
>>> >> is it same compiled methods?
>>> >> Because it is absolutely normal if they using different source
>>> >> pointer.
>>> >>
>>> >
>>> > I didn't understand your question. Yes, it is exactly the same
>>> > CompiledMethod.
>>> > Look, if I do:
>>> >
>>> > (CompiledMethod allInstances select:� [:each | each trailer kind =
>>> > #VarLengthSourcePointer] ) first
>>> >
>>> > I get
>>> > ---> (CodeLoader class>>#initialize "a CompiledMethod(311951360)")
>>> >
>>> > So...it means that such CompiledMethod answers #VarLengthSourcePointer
>>> > when
>>> > send "trailer kind". Ok?
>>> >
>>> > But immediatly after, if I ask the trailer kind to the SAME compiled
>>> > method:
>>> >
>>> > (CodeLoader class >> #initialize) trailer kind
>>> >
>>> > I get
>>> > ----> #SourcePointer
>>> >
>>> > WHYYY??� why it is answering #SourcePointer instead of
>>> > #VarLengthSourcePointer� ??
>>> >
>>> >>
>>> >> > thanks in advance,
>>> >> >
>>> >> > --
>>> >> > Mariano
>>> >> > http://marianopeck.wordpress.com
>>> >> >
>>> >> >
>>> >>
>>> >>
>>> >>
>>> >> --
>>> >> Best regards,
>>> >> Igor Stasenko AKA sig.
>>> >>
>>> >
>>> >
>>> >
>>> > --
>>> > Mariano
>>> > http://marianopeck.wordpress.com
>>> >
>>> >
>>>
>>
>>
>>
>> --
>> Mariano
>> http://marianopeck.wordpress.com
>>
>
>
>
> --
> Mariano
> http://marianopeck.wordpress.com
>
>
Best regards,
Igor Stasenko AKA sig.
--