[squeak-dev] The Trunk: Compiler-nice.129.mcz

Levente Uzonyi leves at elte.hu
Mon Mar 1 23:19:19 UTC 2010


Thanks for the fix Nicolas.
Too bad #asOrderedCollection creates a copy even if it's sent to an 
OrderedCollection. I wonder if there's a way to fix it without breaking 
existing code.


Levente

On Mon, 1 Mar 2010, commits at source.squeak.org wrote:

> Nicolas Cellier uploaded a new version of Compiler to project The Trunk:
> http://source.squeak.org/trunk/Compiler-nice.129.mcz
>
> ==================== Summary ====================
>
> Name: Compiler-nice.129
> Author: nice
> Time: 1 March 2010, 11:24:30.271 pm
> UUID: a27b827d-1354-1147-bc1a-edeb6e1f0e97
> Ancestors: Compiler-nice.128
>
> Fix Compiler/Decompiler temporary slot mismatch
> http://bugs.squeak.org/view.php?id=7467
>
> See also my comments in response to
> http://lists.squeakfoundation.org/pipermail/squeak-dev/2010-March/145280.html
>
> Eliot, please check....
>
> =============== Diff against Compiler-nice.128 ===============
>
> Item was changed:
>  InstructionStream subclass: #Decompiler
>  	instanceVariableNames: 'constructor method instVars tempVars constTable stack statements lastPc exit caseExits lastJumpPc lastReturnPc limit hasValue blockStackBase numLocalTemps blockStartsToTempVars tempVarCount'
>  	classVariableNames: 'ArgumentFlag CascadeFlag CaseFlag IfNilFlag'
>  	poolDictionaries: ''
>  	category: 'Compiler-Kernel'!
>
> + !Decompiler commentStamp: 'nice 3/1/2010 19:56' prior: 0!
> - !Decompiler commentStamp: '<historical>' prior: 0!
>  I decompile a method in three phases:
>  	Reverser: postfix byte codes -> prefix symbolic codes (nodes and atoms)
>  	Parser: prefix symbolic codes -> node tree (same as the compiler)
>  	Printer: node tree -> text (done by the nodes)
>
>
>  instance vars:
>
> + 	constructor <DecompilerConstructor> an auxiliary knowing how to generate Abstract Syntax Tree (node tree)
> + 	method <CompiledMethod> the method being decompiled
> + 	instVars <Array of: String> the instance variables of the class implementing method
> + 	tempVars <String | (OrderedCollection of: String)> hold the names of temporary variables (if known)
> + 		NOTE: POLYMORPHISM WILL BE RESOLVED IN #initSymbols:
> + 	constTable <Collection of: ParseNode> parse node associated with byte encoded constants (nil true false 0 1 -1 etc...)
> + 	stack <OrderedCollection of: (ParseNode | String | Integer) > multipurpose...
> + 	statements <OrderedCollection of: ParseNode> the statements of the method being decompiled
> + 	lastPc <Integer>
> + 	exit <Integer>
> + 	caseExits <OrderedCollection of: Integer> - stack of exit addresses that have been seen in the branches of caseOf:'s
> + 	lastJumpPc <Integer>
> + 	lastReturnPc <Integer>
> + 	limit <Integer>
> + 	hasValue <Boolean>
> + 	blockStackBase <Integer>
> + 	numLocaltemps <Integer | Symbol> - number of temps local to a block; also a flag indicating decompiling a block
> + 	blockStartsToTempVars <Dictionary key: Integer value: (OrderedCollection of: String)>
> + 	tempVarCount <Integer> number of temp vars used by the method!
> - 	constructor
> - 	method
> - 	instVars
> - 	tempVars
> - 	constTable
> - 	stack
> - 	statements
> - 	lastPc
> - 	exit
> - 	caseExits	- stack of exit addresses that have been seen in the branches of caseOf:'s
> - 	lastJumpPc
> - 	lastReturnPc
> - 	limit
> - 	hasValue
> - 	blockStackBase
> - 	numLocaltemps - number of temps local to a block; also a flag indicating decompiling a block!
>
> Item was added:
> + ----- Method: BlockNode>>makeTemporariesRemovable (in category 'code generation (closures)') -----
> + makeTemporariesRemovable
> + 	"Utilities for when we want to remove some temporaries."
> +
> + 	temporaries isArray ifTrue:
> + 		[temporaries := temporaries asOrderedCollection].!
>
> Item was changed:
>  ----- Method: BlockNode>>addRemoteTemp:rootNode: (in category 'code generation (closures)') -----
>  addRemoteTemp: aTempVariableNode rootNode: rootNode "<MethodNode>"
>  	"Add aTempVariableNode to my actualScope's sequence of
>  	 remote temps.  If I am an optimized block then the actual
>  	 scope is my actualScopeIfOptimized, otherwise it is myself."
> - 	temporaries isArray ifTrue:
> - 		[temporaries := temporaries asOrderedCollection].
>  	remoteTempNode == nil ifTrue:
>  		[remoteTempNode := RemoteTempVectorNode new
>  								name: self remoteTempNodeName
>  								index: arguments size + temporaries size
>  								type: LdTempType
>  								scope: 0.
>  		 actualScopeIfOptimized
>  			ifNil:
> + 				[self addTempNode: remoteTempNode.
> - 				[temporaries addLast: remoteTempNode.
>  				 remoteTempNode definingScope: self]
>  			ifNotNil: [actualScopeIfOptimized addHoistedTemps: { remoteTempNode }]].
>  	remoteTempNode addRemoteTemp: aTempVariableNode encoder: rootNode encoder.
>  	"use remove:ifAbsent: because the deferred analysis for optimized
>  	 loops can result in the temp has already been hoised into the root."
> + 	self actualScope removeTempNode: aTempVariableNode ifAbsent: [].
> - 	temporaries remove: aTempVariableNode ifAbsent: [].
>  	^remoteTempNode!
>
> Item was added:
> + ----- Method: BlockNode>>addTempNode: (in category 'code generation (closures)') -----
> + addTempNode: aTempVariableNode
> + 	"Utilities for when we want to add some temporaries."
> +
> + 	self makeTemporariesRemovable.
> + 	^temporaries add: aTempVariableNode!
>
> Item was added:
> + ----- Method: BlockNode>>removeTempNode:ifAbsent: (in category 'code generation (closures)') -----
> + removeTempNode: aTempVariableNode ifAbsent: aBlock
> + 	"Utilities for when we want to remove some temporaries."
> +
> + 	self makeTemporariesRemovable.
> + 	^temporaries remove: aTempVariableNode ifAbsent: aBlock
> + 	!
>
>
>



More information about the Squeak-dev mailing list