Eliot Miranda uploaded a new version of Compiler to project The Trunk:
http://source.squeak.org/trunk/Compiler-eem.443.mcz ==================== Summary ==================== Name: Compiler-eem.443 Author: eem Time: 2 October 2020, 12:25:28.42646 pm UUID: c0b19571-c72e-4d7e-9081-41b61e767e6b Ancestors: Compiler-eem.442 Decompiler/CompiledCode: startKeysToBlockExtents has moved from CompiledMethod to DebuggerMethodMap. =============== Diff against Compiler-eem.442 =============== Item was removed: - ----- Method: CompiledBlock>>startKeysToBlockExtents (in category '*Compiler-support') ----- - startKeysToBlockExtents - ^self homeMethod startKeysToBlockExtents! Item was removed: - ----- Method: CompiledMethod>>blockExtentsInto:from:to:method:numberer: (in category '*Compiler-support') ----- - blockExtentsInto: aDictionary from: initialPC to: endPC method: method numberer: numbererBlock - "Support routine for startpcsToBlockExtents" - | pcs extentStart locator scanner blockSizeOrMethodOrLocator | - self flag: 'belongs in DebuggerMethodMap'. - extentStart := numbererBlock value. - locator := BlockStartLocator new. - scanner := InstructionStream new method: method pc: initialPC. - pcs := OrderedCollection new. - [pcs addLast: scanner pc. - scanner pc <= endPC] whileTrue: - [blockSizeOrMethodOrLocator := scanner interpretNextInstructionFor: locator. - blockSizeOrMethodOrLocator ~~ locator ifTrue: - [blockSizeOrMethodOrLocator isInteger - ifTrue: - [self - blockExtentsInto: aDictionary - from: scanner pc - to: scanner pc + blockSizeOrMethodOrLocator - 1 - method: method - numberer: numbererBlock. - scanner pc: scanner pc + blockSizeOrMethodOrLocator] - ifFalse: - [self assert: blockSizeOrMethodOrLocator isCompiledBlock. - self - blockExtentsInto: aDictionary - from: blockSizeOrMethodOrLocator initialPC - to: blockSizeOrMethodOrLocator endPC - method: blockSizeOrMethodOrLocator - numberer: numbererBlock]]]. - aDictionary - at: (method isCompiledBlock - ifTrue: [method] - ifFalse: [initialPC]) - put: (extentStart to: numbererBlock value). - ^aDictionary! Item was removed: - ----- Method: CompiledMethod>>startKeysToBlockExtents (in category '*Compiler-support') ----- - startKeysToBlockExtents - "Answer a Dictionary of start key to Interval of blockExtent, using the - identical numbering scheme described in and orchestrated by - BlockNode>>analyseArguments:temporaries:rootNode:. A start key - identifies a block within a method and is either the startpc for an - embedded block or the block method itself for a full block. This is - used in part to find the temp names for any block in a method, as - needed by the debugger. The other half is to recompile the method, - obtaining the temp names for each block extent. By indirecting through - the blockExtent instead of using the startpc directly we decouple the - debugger's access to temp names from the exact bytecode; insulating - debugging from minor changes in the compiler (e.g. changes in literal - pooling, adding prefix bytecodes, adding inst vars to CompiledMethod - in literals towards the end of the literal frame, etc). If the recompilation - doesn't produce exactly the same bytecode at exactly the same offset - no matter; the blockExtents will be the same." - | index | - self flag: 'belongs in DebuggerMethodMap'. - index := 0. - ^self - blockExtentsInto: self newBlockStartMap - from: self initialPC - to: self endPC - method: self - numberer: [| value | value := index. index := index + 2. value]! Item was changed: ----- Method: Decompiler>>mapFromBlockKeysIn:toTempVarsFrom:constructor: (in category 'initialize-release') ----- mapFromBlockKeysIn: aMethod toTempVarsFrom: schematicTempNamesString constructor: aDecompilerConstructor + "Answer a (n Identity) Dictionary from block start key to sequence of TermpVarNode & RemoteTempVarNode" | startMap tempMap | + "This rather odd construct is to avoid recursion if we used aMethod methodNode startKeysToBlockExtents, + which will invoke this Decompiler if a method has no source." + startMap := (DebuggerMethodMap + forMethod: aMethod + methodNode: nil) startKeysToBlockExtents. - startMap := aMethod startKeysToBlockExtents. tempMap := aMethod mapFromBlockKeys: (startMap keys asArray sort: [:a :b| (startMap at: a) first <= (startMap at: b) first]) toSchematicTemps: schematicTempNamesString. tempMap keysAndValuesDo: [:startKey :tempNameTupleVector| tempNameTupleVector isEmpty ifFalse: [| subMap numTemps tempVector | subMap := Dictionary new. "Find how many temp slots there are (direct & indirect temp vectors) and for each indirect temp vector find how big it is." tempNameTupleVector do: [:tuple| tuple last isArray ifTrue: [subMap at: tuple last first put: tuple last last. numTemps := tuple last first] ifFalse: [numTemps := tuple last]]. "create the temp vector for this scope level." tempVector := Array new: numTemps. "fill it in with any indirect temp vectors" subMap keysAndValuesDo: [:index :size| tempVector at: index put: (Array new: size)]. "fill it in with temp nodes." tempNameTupleVector do: [:tuple| | itv | tuple last isArray ifTrue: [itv := tempVector at: tuple last first. itv at: tuple last last put: (aDecompilerConstructor codeTemp: tuple last last - 1 named: tuple first)] ifFalse: [tempVector at: tuple last put: (aDecompilerConstructor codeTemp: tuple last - 1 named: tuple first)]]. "replace any indirect temp vectors with proper RemoteTempVectorNodes" subMap keysAndValuesDo: [:index :size| tempVector at: index put: (aDecompilerConstructor codeRemoteTemp: index remoteTemps: (tempVector at: index))]. "and update the entry in the map" tempMap at: startKey put: tempVector]]. ^tempMap! |
Free forum by Nabble | Edit this page |