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
!
packages@lists.squeakfoundation.org