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

commits at source.squeak.org commits at source.squeak.org
Fri Nov 9 22:23:04 UTC 2012


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

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

Name: Compiler-eem.242
Author: eem
Time: 9 November 2012, 2:22:42.152 pm
UUID: 1f233dff-53b6-4ddd-977f-66550a4f0269
Ancestors: Compiler-eem.241

Further fix decompilation of to:do: loops now they return
their receiver.  Fixes the case where the loop is the last
statement in an ifTrue:ifFalse: branch, e.g. the recompilation
of Object>>#veryDeepCopyWith:.

=============== Diff against Compiler-eem.241 ===============

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])
  		ifTrue:
  			[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].
  			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...].
+ 	The complication here is that limitVar := limitExpr's value may be used, in which case it'll
+ 	be statements last, or may not be used, in which case it'll be statements nextToLast."
- 		startExpr to: limitExpr by: incConst do: [:var | ...statements...]"
  	statements size < 2 ifTrue: [^ self].
+ 	limitStmt := statements last.
- 	limitStmt := statements at: statements size-1.
  	((limitStmt isMemberOf: AssignmentNode)
  		and: [limitStmt variable isTemp
+ 		and: [limitStmt variable == toDoStmt arguments first]]) ifFalse:
+ 			[limitStmt := statements at: statements size-1.
+ 			((limitStmt isMemberOf: AssignmentNode)
+ 				and: [limitStmt variable isTemp
+ 				and: [limitStmt variable == toDoStmt arguments first]]) ifFalse:
+ 					[^self]].
+ 
+ 	(self blockScopeRefersOnlyOnceToTemp: limitStmt variable fieldOffset) ifFalse:
+ 		[^self].
- 		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 last == limitStmt
+ 		ifTrue: [statements removeLast]
+ 		ifFalse: [statements removeLast; removeLast; addLast: toDoStmt]!
- 	statements removeLast; removeLast; addLast: toDoStmt
- 
- !



More information about the Squeak-dev mailing list