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

commits at source.squeak.org commits at source.squeak.org
Sun Dec 27 04:02:04 UTC 2009


Nicolas Cellier uploaded a new version of Compiler to project The Trunk:
http://source.squeak.org/trunk/Compiler-nice.111.mcz

==================== Summary ====================

Name: Compiler-nice.111
Author: nice
Time: 27 December 2009, 5:01:29 am
UUID: 46325f49-4b22-499c-aa2d-9cc5f16ebd65
Ancestors: Compiler-nice.110

Cosmetic: move or remove a few temps inside closures

=============== Diff against Compiler-nice.110 ===============

Item was changed:
  ----- Method: MessageNode>>sizeForValue: (in category 'code generation') -----
  sizeForValue: encoder
+ 	| total |
- 	| total argSize |
  	special > 0 
  		ifTrue: [^self perform: (MacroSizers at: special) with: encoder with: true].
  	receiver == NodeSuper
  		ifTrue: [selector := selector copy "only necess for splOops"].
  	total := selector size: encoder args: arguments size super: receiver == NodeSuper.
  	receiver == nil 
  		ifFalse: [total := total + (receiver sizeForValue: encoder)].
  	sizes := arguments collect: 
+ 					[:arg | | argSize | 
- 					[:arg | 
  					argSize := arg sizeForValue: encoder.
  					total := total + argSize.
  					argSize].
  	^total!

Item was changed:
  ----- Method: MessageNode>>sizeCodeForValue: (in category 'code generation (new scheme)') -----
  sizeCodeForValue: encoder
+ 	| total |
- 	| total argSize |
  	special > 0 
  		ifTrue: [^self perform: (NewStyleMacroSizers at: special) with: encoder with: true].
  	receiver == NodeSuper
  		ifTrue: [selector := selector copy "only necess for splOops"].
  	total := selector sizeCode: encoder args: arguments size super: receiver == NodeSuper.
  	receiver == nil 
  		ifFalse: [total := total + (receiver sizeCodeForValue: encoder)].
  	sizes := arguments collect: 
+ 					[:arg | | argSize | 
- 					[:arg | 
  					argSize := arg sizeCodeForValue: encoder.
  					total := total + argSize.
  					argSize].
  	^total!

Item was changed:
  ----- Method: MessageNode>>sizeCodeForCase:value: (in category 'code generation (new scheme)') -----
  sizeCodeForCase: encoder value: forValue
  
+ 	| braceNode sizeIndex elseSize allReturn |
- 	| braceNode sizeIndex thenSize elseSize allReturn |
  	forValue not ifTrue:
  		[^super sizeCodeForEffect: encoder].
  	equalNode := encoder encodeSelector: #=.
  	braceNode := arguments first.
  	sizes := Array new: 2 * braceNode numElements.
  	sizeIndex := sizes size.
  	elseSize := arguments size = 2
  		ifTrue:
  			[arguments last sizeCodeForEvaluatedValue: encoder] "otherwise: [...]"
  		ifFalse:
  			[caseErrorNode := encoder encodeSelector: #caseError.
  			 (NodeSelf sizeCodeForValue: encoder)
  			 + (caseErrorNode sizeCode: encoder args: 0 super: false)]. "self caseError"
  	"There must be at least one branch around the otherwise/caseError
  	  so the decompiler can identify the end of the otherwise/caseError."
  	allReturn := true. "assume every case ends with a return"
  	braceNode casesForwardDo:
  		[:keyNode :valueNode :last |
  		valueNode returns ifFalse: [allReturn := false]].
  	braceNode casesReverseDo:
+ 		[:keyNode :valueNode :last | | thenSize |
- 		[:keyNode :valueNode :last |
  		sizes at: sizeIndex put: elseSize.
  		thenSize := valueNode sizeCodeForEvaluatedValue: encoder.
  		last ifFalse: [thenSize := thenSize + encoder sizePop].
  		valueNode returns ifFalse: [thenSize := thenSize + (self sizeCode: encoder forJump: elseSize)].
  		(last and: [allReturn]) ifTrue: [thenSize := thenSize + (self sizeCode: encoder forJump: elseSize)].
  		sizes at: sizeIndex-1 put: thenSize.
  		last ifFalse: [elseSize := elseSize + encoder sizeDup].
  		elseSize := elseSize
  					+ (keyNode sizeCodeForEvaluatedValue: encoder)
  					+ (equalNode sizeCode: encoder args: 1 super: false)
  					+ (self sizeCode: encoder forBranchOn: false dist: thenSize)
  					+ thenSize.
  		sizeIndex := sizeIndex - 2].
  	^(receiver sizeCodeForValue: encoder) + elseSize!

Item was changed:
  ----- Method: MessageNode>>sizeCase:value: (in category 'code generation') -----
  sizeCase: encoder value: forValue
  
+ 	| braceNode sizeIndex elseSize |
- 	| braceNode sizeIndex thenSize elseSize |
  	forValue not
  		ifTrue: [^super sizeForEffect: encoder].
  	equalNode := encoder encodeSelector: #=.
  	braceNode := arguments first.
  	sizes := Array new: 2 * braceNode numElements.
  	sizeIndex := sizes size.
  	elseSize := arguments size = 2
  		ifTrue:
  			[arguments last sizeForEvaluatedValue: encoder] "otherwise: [...]"
  		ifFalse:
  			[caseErrorNode := encoder encodeSelector: #caseError.
  			 1 + (caseErrorNode size: encoder args: 0 super: false)]. "self caseError"
  	braceNode casesReverseDo:
+ 		[:keyNode :valueNode :last | | thenSize |
- 		[:keyNode :valueNode :last |
  		sizes at: sizeIndex put: elseSize.
  		thenSize := valueNode sizeForEvaluatedValue: encoder.
  		last ifFalse: [thenSize := thenSize + 1]. "Pop"
  		valueNode returns ifFalse: [thenSize := thenSize + (self sizeJump: elseSize)].
  		sizes at: sizeIndex-1 put: thenSize.
  		last ifFalse: [elseSize := elseSize + 1]. "Dup"
  		elseSize := elseSize + (keyNode sizeForEvaluatedValue: encoder) +
  			(equalNode size: encoder args: 1 super: false) +
  			(self sizeBranchOn: false dist: thenSize) + thenSize.
  		sizeIndex := sizeIndex - 2].
  	^(receiver sizeForValue: encoder) + elseSize
  !

Item was changed:
  ----- Method: MethodHighlightingTests>>asXML (in category 'tests') -----
  asXML
  	"self new asXML"
  	"Convert the master index into external XML representation"
+ 	
+ 	^String streamContents:[:s| | writer |
- 	| writer |
- 	^String streamContents:[:s|
  		writer := XMLWriter on: s.
  		writer xmlDeclaration: '1.0'.
  		writer startTag: 'recording'; endTag.
  			writer tag: 'creator' pcData: creator.
  			writer tag: 'timestamp' pcData: timeStamp.
  			writer tag: 'duration' pcData: duration.
  			writer startTag: 'tracks'; endTag.
  				tracks do:[:tdata|
  					writer startTag: 'track'; attribute: 'type' value: tdata value; endTag.
  					writer pcData: tdata key.
  					writer endTag: 'track'.
  				].
  			writer endTag: 'tracks'.
  		writer endTag: 'recording'.
  	].
  !

Item was changed:
  ----- Method: Parser>>externalFunctionDeclaration (in category 'primitives') -----
  externalFunctionDeclaration
  	"Parse the function declaration for a call to an external library."
+ 	| descriptorClass callType retType externalName args argType module |
- 	| descriptorClass callType retType externalName args argType module fn |
  	descriptorClass := Smalltalk at: #ExternalFunction ifAbsent:[nil].
  	descriptorClass == nil ifTrue:[^false].
  	callType := descriptorClass callingConventionFor: here.
  	callType == nil ifTrue:[^false].
  	"Parse return type"
  	self advance.
  	retType := self externalType: descriptorClass.
  	retType == nil ifTrue:[^self expected:'return type'].
  	"Parse function name or index"
  	externalName := here.
  	(self match: #string) 
  		ifTrue:[externalName := externalName asSymbol]
  		ifFalse:[(self match:#number) ifFalse:[^self expected:'function name or index']].
  	(self matchToken: #'(') ifFalse:[^self expected:'argument list'].
  	args := WriteStream on: Array new.
  	[here == #')'] whileFalse:[
  		argType := self externalType: descriptorClass.
  		argType == nil ifTrue:[^self expected:'argument'].
  		argType isVoid & argType isPointerType not ifFalse:[args nextPut: argType].
  	].
  	(self matchToken:#')') ifFalse:[^self expected:')'].
  	(self matchToken: 'module:') ifTrue:[
  		module := here.
  		(self match: #string) ifFalse:[^self expected: 'String'].
  		module := module asSymbol].
+ 	Smalltalk at: #ExternalLibraryFunction ifPresent:[:xfn| | fn |
- 	Smalltalk at: #ExternalLibraryFunction ifPresent:[:xfn|
  		fn := xfn name: externalName 
  				module: module 
  				callType: callType
  				returnType: retType
  				argumentTypes: args contents.
  		self allocateLiteral: fn.
  	].
  	self addPragma: (Pragma keyword: #primitive: arguments: #(120)).
  	^true!

Item was changed:
  ----- Method: Parser>>removeUnusedTemps (in category 'error correction') -----
  removeUnusedTemps
  	"Scan for unused temp names, and prompt the user about the prospect of removing each one found"
  
+ 	| str madeChanges | 
- 	| str end start madeChanges | 
  	madeChanges := false.
  	str := requestor text asString.
  	((tempsMark between: 1 and: str size)
  		and: [(str at: tempsMark) = $|]) ifFalse: [^ self].
  	encoder unusedTempNames do:
+ 		[:temp | | start end |
- 		[:temp |
  		(UnusedVariable name: temp) ifTrue:
  			[(encoder encodeVariable: temp) isUndefTemp
  				ifTrue:
  					[end := tempsMark.
  					["Beginning at right temp marker..."
  					start := end - temp size + 1.
  					end < temp size or: [temp = (str copyFrom: start to: end)
  							and: [(str at: start-1) isSeparator & (str at: end+1) isSeparator]]]
  						whileFalse:
  							["Search left for the unused temp"
  							end := requestor nextTokenFrom: end direction: -1].
  					end < temp size ifFalse:
  						[(str at: start-1) = $  ifTrue: [start := start-1].
  						requestor correctFrom: start to: end with: ''.
  						str := str copyReplaceFrom: start to: end with: ''. 
  						madeChanges := true.
  						tempsMark := tempsMark - (end-start+1)]]
  				ifFalse:
  					[self inform:
  'You''ll first have to remove the\statement where it''s stored into' withCRs]]].
  	madeChanges ifTrue: [ReparseAfterSourceEditing signal]!

Item was changed:
  ----- Method: MessageNode>>emitCase:on:value: (in category 'code generation') -----
  emitCase: stack on: strm value: forValue
  
+ 	| braceNode sizeStream |
- 	| braceNode sizeStream thenSize elseSize |
  	forValue not
  		ifTrue: [^super emitForEffect: stack on: strm].
  	braceNode := arguments first.
  	sizeStream := ReadStream on: sizes.
  	receiver emitForValue: stack on: strm.
  	braceNode casesForwardDo:
+ 		[:keyNode :valueNode :last | | thenSize elseSize |
- 		[:keyNode :valueNode :last |
  		thenSize := sizeStream next.
  		elseSize := sizeStream next.
  		last ifFalse: [strm nextPut: Dup. stack push: 1].
  		keyNode emitForEvaluatedValue: stack on: strm.
  		equalNode emit: stack args: 1 on: strm.
  		self emitBranchOn: false dist: thenSize pop: stack on: strm.
  		last ifFalse: [strm nextPut: Pop. stack pop: 1].
  		valueNode emitForEvaluatedValue: stack on: strm.
  		last ifTrue: [stack pop: 1].
  		valueNode returns ifFalse: [self emitJump: elseSize on: strm]].
  	arguments size = 2
  		ifTrue:
  			[arguments last emitForEvaluatedValue: stack on: strm] "otherwise: [...]"
  		ifFalse:
  			[NodeSelf emitForValue: stack on: strm.
  			caseErrorNode emit: stack args: 0 on: strm]!




More information about the Squeak-dev mailing list