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

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