[Pharo-project] How to copy a CompiledMethod?

Stéphane Ducasse Stephane.Ducasse at inria.fr
Fri Nov 26 10:09:31 CET 2010


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