all that for getting a method definition hidden by another one :(.
We should definitively changes the sources and changes absence of structure. changeRecordForOverriddenMethod: aMethodReference | sourceFilesCopy method position | method := aMethodReference actualClass compiledMethodAt: aMethodReference methodSymbol. position := method filePosition. sourceFilesCopy := SourceFiles collect: [ :x | x isNil ifTrue: [ nil ] ifFalse: [ x readOnlyCopy ] ]. [ | file prevPos prevFileIndex chunk stamp methodCategory tokens | method fileIndex == 0 ifTrue: [ ^ nil ]. file := sourceFilesCopy at: method fileIndex. [ position notNil & file notNil ] whileTrue: [ file position: (0 max: position - 150). "Skip back to before the preamble" [ file position < (position - 1) ] whileTrue: [ chunk := file nextChunk ]. "then pick it up from the front" "Preamble is likely a linked method preamble, if we're in a changes file (not the sources file). Try to parse it for prior source position and file index" prevPos := nil. stamp := ''. (chunk findString: 'methodsFor:' startingAt: 1) > 0 ifTrue: [ tokens := Scanner new scanTokens: chunk ] ifFalse: [ tokens := Array new "ie cant be back ref" ]. ((tokens size between: 7 and: 8) and: [ (tokens at: tokens size - 5) = #methodsFor: ]) ifTrue: [ (tokens at: tokens size - 3) = #stamp: ifTrue: [ "New format gives change stamp and unified prior pointer" stamp := tokens at: tokens size - 2. prevPos := tokens last. prevFileIndex := sourceFilesCopy fileIndexFromSourcePointer: prevPos. prevPos := sourceFilesCopy filePositionFromSourcePointer: prevPos ] ifFalse: [ "Old format gives no stamp; prior pointer in two parts" prevPos := tokens at: tokens size - 2. prevFileIndex := tokens last ]. (prevPos = 0 or: [ prevFileIndex = 0 ]) ifTrue: [ prevPos := nil ] ]. ((tokens size between: 5 and: 6) and: [ (tokens at: tokens size - 3) = #methodsFor: ]) ifTrue: [ (tokens at: tokens size - 1) = #stamp: ifTrue: [ "New format gives change stamp and unified prior pointer" stamp := tokens at: tokens size ] ]. methodCategory := tokens after: #methodsFor: ifAbsent: [ 'as yet unclassifed' ]. (self includesMethodCategory: methodCategory ofClass: aMethodReference actualClass) ifTrue: [ methodCategory = (Smalltalk globals at: #Categorizer ifAbsent: [ Smalltalk globals at: #ClassOrganizer ]) default ifTrue: [ methodCategory := methodCategory , ' ' ]. ^ ChangeRecord new file: file position: position type: #method class: aMethodReference classSymbol category: methodCategory meta: aMethodReference classIsMeta stamp: stamp ]. position := prevPos. prevPos notNil ifTrue: [ file := sourceFilesCopy at: prevFileIndex ] ]. ^ nil ] ensure: [ sourceFilesCopy do: [ :x | x notNil ifTrue: [ x close ] ] ] |
On 27 April 2011 11:32, Stéphane Ducasse <[hidden email]> wrote:
> all that for getting a method definition hidden by another one :(. > We should definitively changes the sources and changes absence of structure. > Amen! > changeRecordForOverriddenMethod: aMethodReference .... [vomit] .... > -- Best regards, Igor Stasenko AKA sig. |
Free forum by Nabble | Edit this page |