Begin forwarded message:
From: nicolas cellier <ncellier@ifrance.com> Date: June 13, 2008 3:28:25 AM CEDT To: squeak-dev@lists.squeakfoundation.org Subject: [squeak-dev] to:do: optimization is wrong when the block modifies the limit Reply-To: The general-purpose Squeak developers list <squeak-dev@lists.squeakfoundation.org
While browsing #to:do: optimization implementation i noticed this:
| n | n := 2. 1 to: n do: [:i | (n := n+1)>10 ifTrue: [self halt: 'Should I get here?']]. ^n
When you think in term of message send, well NO, YOU SHOULD NOT GET HERE.
Optimization is such a subtle thing that:
| n | 1 to: (n := 2) do: [:i | n := n+1. n>10 ifTrue: [self halt: 'You won''t get there']]. ^n
Ha Ha, it's really fun! Of course, if one corrects this bug, there is a pending Decompiler issue:
testDecompileToDoWithMovingLimit | n i | n := 4. i := 1. [i <= n] whileTrue: [ n := n - 1. i := i + 1].
would decompile into: | n | n := 4. 1 to: n do: [:i | n := n - 1]
This is worth a http://bugs.squeak.org/view.php?id=7093 Ah i wonder what would a NewCompiler do to to:do:
Nicolas