2011/9/16 Mariano Martinez Peck <[email protected]>:
> I don't really know. I have implemented what Eliot say in the first option
> and it is working for me.
> Do you (Henry/Lukas/Nicolas/Eliot) agree to have this first solution and
> then improve it if necessary ?
>
> thanks
>

I agree on Mariano/Eliot solution. It is a good pragmatic short term workaround.
In the long term, I wish I can say goodbye to my new super power, it's
a too dangerous power.
So I wish the VM would change (along with ClassBuilder and Tools).

Nicolas

> On Fri, Sep 16, 2011 at 8:12 PM, Stéphane Ducasse
> <[email protected]> wrote:
>>
>> Mariano
>>
>> So should we intgerate a fix?
>>
>> Stef
>>
>> On Sep 15, 2011, at 11:27 PM, Mariano Martinez Peck wrote:
>>
>> >
>> >
>> >
>> > BUT, it doesn't mean that Association is always used for globals.
>> > CompiledMethod equality is failing because of the last literal, the one 
>> > that
>> > maps class name (symbol) and point to the real class. So...when I
>> > materialize, both CMs have non-identical associations for the last literal,
>> > but equal.
>> >
>> > As Henrik says the last literals are ideally #== to each other.
>> >  However, no Squeak dialect makes any attempt to keep the class0side
>> > associations equal. Look at a class-side method and you'll see it's last
>> > literal is nil->SomeClass class.  Now since this association doesn't exist
>> > in Smalltalk (unlike last literals on the instance side) the compiler 
>> > merely
>> > creates distinct ones for each class-side method.
>> >
>> >
>> > Thanks Eliot for that point. In fact, I have just checked and you are
>> > right. The tests that are failing for me is those where class side methods
>> > are involded. In this case, the last literal of the original CM and the
>> > materialized, gives false in #literalEqual:   hence,  originalCM =
>> > materializedCM is false :(
>> >
>> >
>> >
>> > Personally I don't think one can defend the position where method
>> > equality is different for instance-side or class-side methods so there must
>> > be some solutions:
>> >
>> > 1. special case comparison of the last literal (the methodClass
>> > literal), comparing keys and insisting that the keys be #== and the values
>> > be #== (can't just define it as keys #== since all similar class-side
>> > methods will be equal irrespective of their actual class).
>> >
>> >
>> > This one seems the easier and fixes my problem :)
>> >
>> > sameLiteralsAs: method
>> >     "Compare my literals to those of method. This is needed to compare
>> > compiled methods."
>> >
>> >     | numLits literal1 literal2 |
>> >     (numLits := self numLiterals) ~= method numLiterals
>> >         ifTrue: [ ^ false ].
>> >     "The last literal requires special checking instead of using
>> > #literalEqual:"
>> >     1 to: numLits - 1 do: [ :index |
>> >         literal1 := self literalAt: index.
>> >         literal2 := method literalAt: index.
>> >         (literal1 == literal2 or: [ literal1 literalEqual: literal2 ])
>> >             ifFalse: [
>> >                 (index = 1 and: [ #(117 120) includes: self primitive ])
>> >                     ifTrue: [
>> >                         literal1 isArray
>> >                             ifTrue: [
>> >                                 (literal2 isArray and: [ literal1
>> > allButLast = literal2 allButLast ])
>> >                                     ifFalse: [ self halt. ^ false ] ]
>> >                             ifFalse: [
>> >                                 "ExternalLibraryFunction"
>> >                                 (literal1 analogousCodeTo: literal2)
>> >                                     ifFalse: [ self halt. ^ false ] ] ]
>> >                     ifFalse: [
>> >                         index = (numLits - 1)
>> >                             ifTrue: [
>> >                                 "properties"
>> >                                 (self properties analogousCodeTo: method
>> > properties)
>> >                                     ifFalse: [ self halt. ^ false ] ]
>> >                             ifFalse: [ self halt. ^ false ] ] ] ].
>> >     literal1 := self literalAt: numLits.
>> >     literal2 := method literalAt: numLits.
>> >     ^ ((literal1 key == literal2 key) and: [literal1 value == literal2
>> > value]).
>> >
>> >
>> >
>> > 2. special case comparison of the last literal (the methodClass
>> > literal), insisting only that the class of the literal be the same if it
>> > isVariableBinding.
>> >
>> > 3. make the compile unique class-side methodClass literals.  i.e. if a
>> > class already has a class-side method then the compiler or method 
>> > dictionary
>> > insertion code must find that existing association and reuse it
>> >
>> > Other ideas?
>> >
>> > >From my point of view, that literal, the last one does not need to be
>> > identical to assume 2 CMs are equal. They just need to be equal.
>> >
>> >
>> > --
>> > Mariano
>> > http://marianopeck.wordpress.com
>> >
>> >
>> >
>> >
>> > --
>> > best,
>> > Eliot
>> >
>> >
>> >
>> >
>> >
>> >
>> >
>> > --
>> > Mariano
>> > http://marianopeck.wordpress.com
>> >
>>
>>
>
>
>
> --
> Mariano
> http://marianopeck.wordpress.com
>
>

Reply via email to