[Pharo-project] How to copy a CompiledMethod?

Gabriel Hernán Barbuto gbarbuto at gmail.com
Fri Nov 26 10:25:46 CET 2010


No. I did something even more simpler. I looked at CompiledMethod's
veryDeepCopy and that explains the behavior. The comment states:

	"Return self.  I am always shared.  Do not record me.  Only use this
for blocks.  Normally methodDictionaries should not be copied this
way."

So, I wonder in which way should method dictionaries be copied.

Bests
Gabriel



On Fri, Nov 26, 2010 at 10:09 AM, Stéphane Ducasse
<Stephane.Ducasse at inria.fr> wrote:
> May be you should try to define a postCopy method on compiledMethod.
> Now I do not know if the system relies on assumption that copy = shallowcopy for compiledMethods.
>
> Did you check the senders of verydeepcopy?
>
> Stef
> On Nov 25, 2010, at 11:57 PM, Gabriel Hernán Barbuto wrote:
>
>> 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