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