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
