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
>>
>>
>