On Fri, Sep 16, 2011 at 12:32 PM, Stéphane Ducasse <
[email protected]> wrote:

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

+1000.  this is a platform and platforms remain in one place even as they
get better and better facilities :)


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


-- 
best,
Eliot

Reply via email to