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 - - ! |
Free forum by Nabble | Edit this page |