2011/9/16 Nicolas Cellier <[email protected]>:
> 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
>

Or maybe after reading:

    literal1 := self literalAt: numLits.
    literal2 := method literalAt: numLits.
    ^ (literal1 == literal2) or: [literal1 key isNil == literal2 key
isNil and: [literal1 value == literal2 value]].

I we are sure that the last literal is always an Association

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