[squeak-dev] The Inbox: Compiler-fm.287.mcz
commits at source.squeak.org
commits at source.squeak.org
Sat Aug 9 05:57:43 UTC 2014
A new version of Compiler was added to project The Inbox:
http://source.squeak.org/inbox/Compiler-fm.287.mcz
==================== Summary ====================
Name: Compiler-fm.287
Author: fm
Time: 9 August 2014, 1:57:32.957 am
UUID: b7426a7e-9098-8b42-aa28-093253343ff4
Ancestors: Compiler-eem.286
avoid conflicts between temp names and instvar names (mostly valuable when decompiling without temp names),
also do not create remote temp names starting with underscore, this is unsupported
=============== Diff against Compiler-eem.286 ===============
Item was changed:
----- Method: Decompiler>>doClosureCopyCopiedValues:numArgs:blockSize: (in category 'control') -----
doClosureCopyCopiedValues: blockCopiedValues numArgs: numArgs blockSize: blockSize
| startpc savedTemps savedTempVarCount savedNumLocalTemps
jump blockArgs blockTemps blockTempsOffset block |
savedTemps := tempVars.
savedTempVarCount := tempVarCount.
savedNumLocalTemps := numLocalTemps.
jump := blockSize + (startpc := pc).
+ numLocalTemps := BlockLocalTempCounter tempCountForBlockStartingAt: pc in: method.
- numLocalTemps := BlockLocalTempCounter
- tempCountForBlockStartingAt: pc
- in: method.
blockTempsOffset := numArgs + blockCopiedValues size.
(blockStartsToTempVars notNil "implies we were intialized with temp names."
and: [blockStartsToTempVars includesKey: pc])
ifTrue:
[tempVars := blockStartsToTempVars at: pc]
ifFalse:
[blockArgs := (1 to: numArgs) collect:
+ [:i| | uniqueName |
+ uniqueName := 't', (tempVarCount + i) printString.
+ [constructor instVars includes: uniqueName] whileTrue: [uniqueName := 't', uniqueName].
+ (constructor
+ codeTemp: i - 1
+ named: uniqueName)
+ beBlockArg].
- [:i| (constructor
- codeTemp: i - 1
- named: 't', (tempVarCount + i) printString)
- beBlockArg].
blockTemps := (1 to: numLocalTemps) collect:
+ [:i| | uniqueName |
+ uniqueName := 't', (tempVarCount + i + numArgs) printString.
+ [constructor instVars includes: uniqueName] whileTrue: [uniqueName := 't', uniqueName].
+ constructor
- [:i| constructor
codeTemp: i + blockTempsOffset - 1
+ named: uniqueName].
- named: 't', (tempVarCount + i + numArgs) printString].
tempVars := blockArgs, blockCopiedValues, blockTemps].
numLocalTemps timesRepeat:
[self interpretNextInstructionFor: self.
stack removeLast].
tempVarCount := tempVarCount + numArgs + numLocalTemps.
block := self blockTo: jump.
stack addLast: ((constructor
codeArguments: (tempVars copyFrom: 1 to: numArgs)
temps: (tempVars copyFrom: blockTempsOffset + 1 to: blockTempsOffset + numLocalTemps)
block: block)
pc: startpc;
yourself).
tempVars := savedTemps.
tempVarCount := savedTempVarCount.
numLocalTemps := savedNumLocalTemps!
Item was changed:
----- Method: Decompiler>>initSymbols: (in category 'initialize-release') -----
initSymbols: aClass
constructor method: method class: aClass literals: method literals.
constTable := constructor codeConstants.
instVars := Array new: aClass instSize.
tempVarCount := method numTemps.
"(tempVars isNil
and: [method holdsTempNames]) ifTrue:
[tempVars := method tempNamesString]."
tempVars isString
ifTrue:
[blockStartsToTempVars := self mapFromBlockStartsIn: method
toTempVarsFrom: tempVars
constructor: constructor.
tempVars := blockStartsToTempVars at: method initialPC]
ifFalse:
[| namedTemps |
+ namedTemps := tempVars ifNil: [(1 to: tempVarCount) collect: [:i| | uniqueName |
+ uniqueName := 't', i printString.
+ [constructor instVars includes: uniqueName] whileTrue: [uniqueName := 't', uniqueName].
+ uniqueName]].
- namedTemps := tempVars ifNil: [(1 to: tempVarCount) collect: [:i| 't', i printString]].
tempVars := (1 to: tempVarCount) collect:
[:i | i <= namedTemps size
ifTrue: [constructor codeTemp: i - 1 named: (namedTemps at: i)]
ifFalse: [constructor codeTemp: i - 1]]].
1 to: method numArgs do:
[:i|
(tempVars at: i) beMethodArg]!
Item was changed:
----- Method: Decompiler>>popIntoTemporaryVariable: (in category 'instruction decoding') -----
popIntoTemporaryVariable: offset
| maybeTVTag tempVector start |
maybeTVTag := stack last.
((maybeTVTag isMemberOf: Association)
and: [maybeTVTag key == #pushNewArray]) ifTrue:
[blockStartsToTempVars notNil "implies we were intialized with temp names."
ifTrue: "Use the provided temps"
[self assert: ((tempVector := tempVars at: offset + 1 ifAbsent: [ParseNode basicNew]) isTemp
and: [tempVector isIndirectTempVector
and: [tempVector remoteTemps size = maybeTVTag value size]])]
ifFalse: "Synthesize some remote temps"
[tempVector := maybeTVTag value.
offset + 1 <= tempVars size
ifTrue:
[start := 2.
tempVector at: 1 put: (tempVars at: offset + 1)]
ifFalse:
[tempVars := (Array new: offset + 1)
replaceFrom: 1
to: tempVars size
with: tempVars.
start := 1].
start to: tempVector size do:
+ [:i| | uniqueName |
+ uniqueName := 't', (tempVarCount + i) printString.
+ [constructor instVars includes: uniqueName] whileTrue: [uniqueName := 't', uniqueName].
- [:i|
tempVector
at: i
put: (constructor
codeTemp: numLocalTemps + offset + i - 1
+ named: uniqueName)].
- named: 't', (tempVarCount + i) printString)].
tempVars at: offset + 1 put: (constructor codeRemoteTemp: offset + 1 remoteTemps: tempVector)].
tempVarCount := tempVarCount + maybeTVTag value size.
stack removeLast.
^self].
self pushTemporaryVariable: offset; doStore: statements!
Item was changed:
----- Method: DecompilerConstructor>>codeInst: (in category 'constructor') -----
codeInst: index
^InstanceVariableNode new
+ name: (instVars at: index + 1 ifAbsent:
+ [(UndeclaredVariableWarning new
+ name: 'instVar with index ', (index + 1) asString
+ selector: method selector
+ class: method methodClass) signal.
+ 'unknownInstanceVariableNameAtIndex', (index + 1) asString])
- name: (instVars at: index + 1 ifAbsent: ['unknown', index asString])
index: index + 1!
Item was added:
+ ----- Method: DecompilerConstructor>>instVars (in category 'constructor') -----
+ instVars
+
+ ^instVars!
Item was changed:
----- Method: DecompilerConstructorForClosures>>codeRemoteTemp:remoteTemps: (in category 'constructor') -----
codeRemoteTemp: index remoteTemps: tempVector
+ | uniqueName |
+ uniqueName := 'r', index printString.
+ [instVars includes: uniqueName] whileTrue: [uniqueName := 'r', uniqueName].
^(RemoteTempVectorNode new
+ name: uniqueName
- name: '_r', index printString
index: index
type: LdTempType
scope: 0)
remoteTemps: tempVector;
yourself!
More information about the Squeak-dev
mailing list
|