> 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
>>
>
> If it's not then one is playing fast and loose with the system.  But if the
> method doesn't contain a super send then as far as the VM is concerned it
> doesn't need an association, and that might be the case with, for example,
> shared inst var accessors in Newspeak.  So instead of assuming its an
> association write it something like
>
>     ^literal1 class == literal2 class
>      and: [literal1 isVariableBinding
>                 ifTrue: [literal1 key = literal2 key and: [literal1 value =
> literal2 value]]
>                 ifFalse: [literal1 = literal2]]
>
>
>>
Thanks. Issue and slice in
http://code.google.com/p/pharo/issues/detail?id=4814




> 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
>> >>
>> >>
>> >
>>
>>
>
>
> --
> best,
> Eliot
>
>
>
>
>


-- 
Mariano
http://marianopeck.wordpress.com

Reply via email to