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 >
