[squeak-dev] The Trunk: Compiler-eem.241.mcz

commits at source.squeak.org commits at source.squeak.org
Tue Nov 6 22:00:25 UTC 2012


Eliot Miranda uploaded a new version of Compiler to project The Trunk:
http://source.squeak.org/trunk/Compiler-eem.241.mcz

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

Name: Compiler-eem.241
Author: eem
Time: 6 November 2012, 1:59:52.95 pm
UUID: 2a0df8c2-f597-4958-9851-e290b9ac05f5
Ancestors: Compiler-eem.240

Fix decompilation of to:do: loops now they return their receiver.

=============== Diff against Compiler-eem.240 ===============

Item was changed:
  ----- Method: Decompiler>>convertToDoLoop (in category 'private') -----
  convertToDoLoop
  	"If statements contains the pattern
  		var := startExpr.
  		[var <= limit] whileTrue: [...statements... var := var + incConst]
  	then replace this by
  		startExpr to: limit by: incConst do: [:var | ...statements...]"
  	| initStmt toDoStmt limitStmt |
+ 	(stack notEmpty
+ 	 and: [stack last isAssignmentNode])
- 	statements size < 2
  		ifTrue:
+ 			[initStmt := stack last.
+ 			 (toDoStmt := statements last toDoFromWhileWithInit: initStmt) ifNil:
- 			[(statements size = 1
- 			  and: [stack notEmpty
- 			  and: [stack last isAssignmentNode]]) ifFalse:
  				[^self].
- 			 initStmt := stack last.
- 			 (toDoStmt := statements last toDoFromWhileWithInit: initStmt) ifNil: [^self].
  			 stack removeLast; addLast: toDoStmt.
  			 statements removeLast]
  		ifFalse:
+ 			[statements size < 2 ifTrue:
+ 				[^self].
+ 			initStmt := statements at: statements size-1.
+ 			(toDoStmt := statements last toDoFromWhileWithInit: initStmt) ifNil:
+ 				[^self].
- 			[initStmt := statements at: statements size-1.
- 			(toDoStmt := statements last toDoFromWhileWithInit: initStmt) ifNil: [^self].
  			statements removeLast; removeLast; addLast: toDoStmt].
  	initStmt variable scope: -1.  "Flag arg as block temp"
  
  	"Attempt further conversion of the pattern
  		limitVar := limitExpr.
  		startExpr to: limitVar by: incConst do: [:var | ...statements...]
  	to
  		startExpr to: limitExpr by: incConst do: [:var | ...statements...]"
  	statements size < 2 ifTrue: [^ self].
  	limitStmt := statements at: statements size-1.
  	((limitStmt isMemberOf: AssignmentNode)
  		and: [limitStmt variable isTemp
  		and: [limitStmt variable == toDoStmt arguments first
  		and: [self blockScopeRefersOnlyOnceToTemp: limitStmt variable fieldOffset]]])
  		ifFalse: [^ self].
  	toDoStmt arguments at: 1 put: limitStmt value.
  	limitStmt variable scope: -2.  "Flag limit var so it won't print"
  	statements removeLast; removeLast; addLast: toDoStmt
  
  !



More information about the Squeak-dev mailing list