[Pharo-project] Issue 3677 in pharo: A to:do: loop cannot modify the limit inside the block

pharo at googlecode.com pharo at googlecode.com
Sun Feb 6 23:03:04 CET 2011


Status: FixedWaitingToBePharoed
Owner: stephane... at gmail.com
Labels: Milestone-1.3 Type-Squeak

New issue 3677 by stephane... at gmail.com: A to:do: loop cannot modify the  
limit inside the block
http://code.google.com/p/pharo/issues/detail?id=3677

Nicolas Cellier uploaded a new version of Compiler to project The Trunk:
http://source.squeak.org/trunk/Compiler-nice.184.mcz

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

Name: Compiler-nice.184
Author: nice
Time: 12 January 2011, 10:09:27.038 pm
UUID: ba12fb9c-6c57-429b-b415-1188e1faba8b
Ancestors: Compiler-nice.183

Fix DecompilerTests>>#testDecompileLoopWithMovingLimit
A to:do: loop cannot modify the limit inside the block

=============== Diff against Compiler-nice.183 ===============

Item was changed:
  ----- Method: MessageNode>>toDoFromWhileWithInit: (in category 'macro  
transformations') -----
  toDoFromWhileWithInit: initStmt
        "Return nil, or a to:do: expression equivalent to this whileTrue:"
        | variable increment limit toDoBlock body test |
        (selector key == #whileTrue:
         and: [initStmt isAssignmentNode
         and: [initStmt variable isTemp]]) ifFalse:
                [^nil].
        body := arguments last statements.
        variable := initStmt variable.
        increment := body last toDoIncrement: variable.
        (increment == nil
         or: [receiver statements size ~= 1]) ifTrue:
                [^nil].
        test := receiver statements first.
        "Note: test chould really be checked that <= or >= comparison
        jibes with the sign of the (constant) increment"
        (test isMessageNode
         and: [(limit := test toDoLimit: variable) notNil]) ifFalse:
                [^nil].
+       "The block must not overwrite the limit"
+       (limit isVariableNode and: [body anySatisfy: [:e | e  
isAssignmentNode and: [e variable = limit]]])
+               ifTrue: [^nil].
        toDoBlock := BlockNode statements: body allButLast returns: false.
        toDoBlock arguments: (Array with: variable).
        variable scope: -1.
        variable beBlockArg.
        ^MessageNode new
                receiver: initStmt value
                selector: (SelectorNode new key: #to:by:do: code: #macro)
                arguments: (Array with: limit with: increment with:  
toDoBlock)
                precedence: precedence!






More information about the Pharo-project mailing list