Eliot Miranda uploaded a new version of Compiler to project The Trunk:
http://source.squeak.org/trunk/Compiler-eem.250.mcz==================== Summary ====================
Name: Compiler-eem.250
Author: eem
Time: 8 February 2013, 3:48:22.229 pm
UUID: 383b74a1-3e1e-4022-a509-aa4e746b333d
Ancestors: Compiler-eem.249
Fix incomplete fix for decompilation of #to:do: loops in
Compiler-eem.242. Fixes decompilation of e.g. compilation
of SoundRecorder>>segmentsAbove:normalizedVolume:
when compiled with Compiler-nice.224 or later.
=============== Diff against Compiler-eem.249 ===============
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.
+ statements removeLast; addLast: toDoStmt]
- 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."
statements size < 2 ifTrue: [^ self].
limitStmt := statements last.
((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].
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]!