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


-- 
Mariano
http://marianopeck.wordpress.com

Reply via email to