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 <[email protected]> wrote: >> On 25 November 2010 20:44, Gabriel Hernán Barbuto <[email protected]> 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. >> >> >
