Hi Mariano, On Wed, May 2, 2012 at 1:27 AM, Mariano Martinez Peck <[email protected] > wrote:
> > > On Tue, May 1, 2012 at 10:17 PM, Mariano Martinez Peck < > [email protected]> wrote: > >> >> >> On Tue, May 1, 2012 at 10:05 PM, Igor Stasenko <[email protected]>wrote: >> >>> On 1 May 2012 21:45, Mariano Martinez Peck <[email protected]> >>> wrote: >>> > >>> > >>> > On Tue, May 1, 2012 at 9:22 PM, Francisco Garau < >>> [email protected]> >>> > wrote: >>> >> >>> >> Your code snippet is comparing the associations. The below one >>> evaluates >>> >> to true: >>> >> >>> >> (Smalltalk globals associationAt: #ScriptLoader) value >>> >> == >>> >> ((SmalltalkImage >> #shrinkToCore) literalAt: 4) value >>> >> >>> > >>> > Yes, but the literals of CompiledMethod that refer to classes should >>> have >>> > the SAME association as Smalltalk globals. In fact, that's the reason >>> why we >>> > have: >>> > >>> indeed. >>> The question is what leads to creation of multiple associations >>> pointing to same global? >>> >> >> >> Exactly. I can easily fix it with a Compiler recompileAll. But the main >> question is if we have a bug or something that could let us in that state. >> >> > > Ok, I wrote an ugly test and I noticed that the ONLY method with this > problem in the image is > > > | behaviorAssociations broken | > behaviorAssociations := Smalltalk globals associations select: [:each | > each value isBehavior or: [each value isTrait]]. > broken := OrderedCollection new. > (CompiledMethod allInstances select: [:each | each isInstalled]) > do: [:aMethod | aMethod literals > do: [:aLiteral | aLiteral isVariableBinding > ifTrue: [ ((behaviorAssociations > includes: aLiteral) > and: > [(behaviorAssociations identityIncludes: aLiteral) not]) > ifTrue: [broken > add: (aMethod -> aLiteral)] > ] > ] > ]. > broken inspect > This doesn't look for unbound class variables. I just wrote something that handles this in Squeak trunk: methodsWithUnboundGlobals "Get all methods that use undeclared global objects that are not listed in Undeclared. For a clean image the result should be empty." "SystemNavigation new methodsWithUnboundGlobals" ^self allSelect: [:m| m literals anySatisfy: [:l| l isVariableBinding and: [l key isSymbol "avoid class-side methodClass literals" and: [(m methodClass bindingOf: l key) isNil and: [(Undeclared associationAt: l key ifAbsent: []) ~~ l]]]]] so the test would be self assert: SystemNavigation new methodsWithUnboundGlobals isEmpty > And I have 6 methods from the classes SmalltalkImage and ScriptLoader and > all the 6 literals are pointing to ScriptLoader. So something weird > happened with this class. > Any idea? > > For the moment I will update the test and do a Compiler recompileAll. > > > > >> >>> > 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 >>> > >>> > instead of the Object implementation. >>> > >>> > >>> >> >>> >> On 1 May 2012 17:52, Mariano Martinez Peck <[email protected]> >>> wrote: >>> >>> >>> >>> (Smalltalk globals associationAt: #ScriptLoader) == ((SmalltalkImage >>> >> >>> >>> #shrinkToCore) literalAt: 4) >>> >>> gives false when it should be true. If I do a Compiler recompileAll >>> it >>> >>> gets fixed. So, my question is, is that normal? how could that >>> happen? >>> >>> is there any real problem behind? >>> >>> >>> >>> anyway, can we do a recompileAll for the moment? >>> >>> >>> >>> thanks! >>> >>> >>> >>> -- >>> >>> Mariano >>> >>> http://marianopeck.wordpress.com >>> >>> >>> >> >>> > >>> > >>> > >>> > -- >>> > Mariano >>> > http://marianopeck.wordpress.com >>> > >>> >>> >>> >>> -- >>> Best regards, >>> Igor Stasenko. >>> >>> >> >> >> -- >> Mariano >> http://marianopeck.wordpress.com >> >> > > > -- > Mariano > http://marianopeck.wordpress.com > > -- best, Eliot
SystemNavigation-methodsWithUnboundGlobals.st
Description: Binary data
