The Trunk: Compiler-eem.443.mcz

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

The Trunk: Compiler-eem.443.mcz

commits-2
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!