[Pharo-project] How to copy a CompiledMethod?

Gabriel Hernán Barbuto gbarbuto at gmail.com
Thu Nov 25 23:57:19 CET 2010


Hi Igor

Thanks for your response. I am quite a new to all this low level
stuff. So please bear with me if I am missing something obvious.

I need to make a deep copy of a method dictionary. I was using copy
but CompiledMethod does not define copy, and so it inherits it from
Object. Object's copy does a shallowCopy followed by a postCopy. None
of these methods is defined by CompiledMethod. So if I use that I will
only get a shallow copy of the CompiledMethod instead of a deep copy.

For example, if I try the following code snippet:

| source copy |
source := Object methodDict at: #at:.
copy := source copy.
Transcript show: 'Equals: '; show: source = copy; cr.
Transcript show: 'Same: '; show: source == copy; cr.
Transcript show: 'Literal at: '; show: source numLiterals - 1; show: ' '.
Transcript show: (source literalAt: source numLiterals - 1); cr.
Transcript show: 'Same AdditionalMethodState: ';
	show: (source literalAt: source numLiterals - 1) == (copy literalAt:
copy numLiterals -1); cr.

I get the following results on Transcript:

Equals: true
Same: false
Literal at: 8 an AdditionalMethodState
Same AdditionalMethodState: true

Here the literal in position 8, an AdditionalMethodState is not being
duplicated. Of course, I selected number 8 because that is the one I
am interested in, but any literal besides symbols will do.

If I replace copy with veryDeepCopy in the snippet above I get the
following results:

Equals: true
Same: true
Literal at: 8 an AdditionalMethodState
Same AdditionalMethodState: true

which are odd since I would not expect them to be the same.

With respect to Pragmas. Please, inspect Object>>#at: and you will see
that there is no pragma in the literals. The pragma is referenced by
the AdditionalMethodState literal.

So I am still looking for the correct, if there is one, way to
completely duplicate a CompiledMethod. Maybe I should take a look at
veryDeepCopy and see why it gives the results it gives and not what I
expect.

Any ideas are welcome.

Best regards
Gabriel

 The problem was that I was still getting references from outside and
I was wondering why.

On Thu, Nov 25, 2010 at 10:14 PM, Igor Stasenko <siguctua at gmail.com> wrote:
> On 25 November 2010 20:44, Gabriel Hernán Barbuto <gbarbuto at gmail.com> wrote:
>> Hi
>>
>> I am trying to make a complete duplicate of a CompiledMethod. I
>> started with CompiledMethod>>#copyWithTrailerBytes: but I think that
>> this way still leaves some things to copy. It duplicates all the
>> literals, but I think that it doesn't duplicate a Pragma if for
>> example, the method has one.
>>
> AFAIR, pragmas are stored as one of literals.
> So, it actually should also make a copy of pragmas.
>
>> Is there a proper way to completely make deep copy of a
>> CompiledMethod? I mean, without writing my own. If there is a way to
>> do it, I don't want to duplicate it.
>>
> if you tell more, why #copy is not enough for you.
>
>> Thanks in advance.
>> Gabriel
>>
>>
>
>
>
> --
> Best regards,
> Igor Stasenko AKA sig.
>
>




More information about the Pharo-project mailing list