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
> 


Reply via email to