On 15. sep. 2011, at 18:45, Mariano Martinez Peck <[email protected]> wrote:

> Ok, I understand. But 
> 
> On Thu, Sep 15, 2011 at 6:05 PM, Henrik Sperre Johansen 
> <[email protected]> wrote:
> On 15.09.2011 17:27, Mariano Martinez Peck wrote:
>> 
>> Hi guys. I am having a problem with the integration of issue 4538: 
>> http://code.google.com/p/pharo/issues/detail?id=4538
>> 
>> I am serializing CompiledMethods with Fuel and then I materialize them. To 
>> test they are correct, I use #= 
>> So far it was working correctly, but now for the materialized method it says 
>> they are not equal. The problem is that #= is failing in
>> 
>> (self sameLiteralsAs: aCompiledMethod)
>> 
>> And inside that method, it is failing because     (literal1 == literal2 or: 
>> [ literal1 literalEqual: literal2 ])
>> answers false.
>> 
>> So... why literal1 literalEqual: literal2 answers false?  from what I can 
>> say, having that selector: "literalEqual", then both MUST be equal, because 
>> they are. 
>> The problem is that it was added:
>> 
>> Association >> literalEqual: otherLiteral
>>     "Answer true if the receiver and otherLiteral represent the same literal.
>>     Variable bindings are literally equals only if identical.
>>     This is how variable sharing works, by preserving identity and changing 
>> only the value."
>>     ^self == otherLiteral
>> 
>> 
>> So....I am not sure I agree with this change. 
>> 
>> Any idea how can we deal with this problem?
>> 
>> Cheers
>> 
>> -- 
>> Mariano
>> http://marianopeck.wordpress.com
>> 
> The change is correct, here's an example:
> 
> Create a global:
> Global := 1
> 
> Create a method:
>    foo
>     ^Global
> 
> Serialize method, deserialize
> 
> Change value of global: 
> Global := 5.
> 
> foo should return 5, not 1. 
> Unless it's actually the same association as in the SystemDictionary, this 
> will not be true.
> 
> 
> I understand that. In fact, in Fuel we use exactly the same association of 
> SystemDictionary for globals. Look this test example:
> 
> testGlobalVariableMethod
> 
>     | materializedCompiledMethod |
>     Smalltalk globals at: #TestGlobalVariableMethod2 put: false. 
>     (self class compileSilently: 'globalVariableForTestingMethod
>     Transcript name. 
>     ^ GlobalVariableForTesting.').
> 
>     materializedCompiledMethod := self materializedCompiledMethod: (self 
> class >> #globalVariableForTestingMethod).
>     Smalltalk globals at: #GlobalVariableForTesting put: true. 
>     self assert:  (materializedCompiledMethod valueWithReceiver: self 
> arguments: #()).
> 
> 
> 
> BUT, it doesn't mean that Association is always used for globals.
Sure they are.
> 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. 
> 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. 

They do:
SomeUnusedClass foo
 ^nil

cm := SomeUnusedClass >> #foo.
Smalltalk at: #SomeUnusedClass put: nil.
cm class = nil

should be true.

Cheers,
Henry

Reply via email to