I dream to rewrite from scratch the classBuilder. But first we should close 
some pending open work.
So going slowler but in a stable manner.

Stef

> 
> 
> On Fri, Sep 16, 2011 at 12:08 PM, Nicolas Cellier 
> <[email protected]> wrote:
> 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).
> 
> Yes, I agree.  It just takes time to get there.
>  
> >
> > 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
> 
> 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]]
> 
> 
> 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
> 


Reply via email to