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
!