Re: [Pharo-project] How to copy a CompiledMethod?
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@gmail.com> wrote:
On 25 November 2010 20:44, Gabriel Hernán Barbuto <gbarbuto@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.
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@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@gmail.com> wrote:
On 25 November 2010 20:44, Gabriel Hernán Barbuto <gbarbuto@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.
participants (2)
-
Gabriel Hernán Barbuto -
Stéphane Ducasse