> Now, why does ring answer true to isActive if the method does not exist any > more?
Because a RGMethod is active when it simply represents a compiledMethod (by opposition to an old version of a method in the versionBrowser). So when we populate the MessageBrowser this is normal that the RG is active (it is done exactly for this purpose). Stef > > > On Mon, Aug 5, 2013 at 10:03 PM, Stéphane Ducasse <[email protected]> > wrote: > Hi guys > > I found a problem with method renaming. The scenario is the following one: > > - you have a message browser open with a list a methods (resulting > from a sender/implementor). > - you rename a method and you get an error > > why because the message browser does not replace the currently changed method. > and the RGMethodDefinition that represented the renamed method defines the > code like that > > MessageBrowser>>wrapItem: anItem > | s | > > s :=String streamContents: [ :aStream | > 3 to: (cachedHierarchy at: anItem) size do: [:i | aStream << > ' ']. > aStream > << anItem methodClass name << ' ('. > anItem isFromTrait > ifTrue: [ aStream << anItem compiledMethod origin > name; space ]. > aStream << (anItem category ifNil: ['']) <<')']. > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ > > ^ {s. anItem selector}. > > RGMethodDefinition>>compiledMethod > "Retrieves the compiled method of this definition if exists" > > | rClass | > (rClass := self realClass) notNil > ifTrue: [ (rClass includesSelector: self selector) > ifTrue: [ ^rClass >> self selector ] ]. > ^nil > > category > > ^ self protocol > > protocol > > self isActive > ifTrue: [ ^ self compiledMethod category ]]. > self isHistorical > ifTrue: [ ^ self protocolAtPointer ifNil:[ self > compiledMethod ifNil:[ protocol ] ifNotNil:[ :cm| cm category ] ] ]. > ^ protocol > > So I patched the protocol method as follows > > protocol > > self isActive > ifTrue: [ ^ self compiledMethod ifNil: [ ' '] ifNotNilDo: [ > :cm | cm category ]]. > "I hate this ifNil test, the problem is that when we rename a > method, a method definition in a list may still refers to > the old selector and the definition of compiled method is > that case is not finding the associated method because it holds the > old selector and not the one corresponding to the one defined > in the class." > self isHistorical > ifTrue: [ ^ self protocolAtPointer ifNil:[ self > compiledMethod ifNil:[ protocol ] ifNotNil:[ :cm| cm category ] ] ]. > ^ protocol > > I imagine that the best solution would be that the tools update their > contents but I wanted to know your point of view. > > Stef > > > >
