["BUG"][FIX?]Incorrect Pseudo-Code for #whileTrue:/#whileFalse:?
Andrew C. Greenberg
werdna at mucow.com
Mon Jan 1 18:29:44 UTC 2001
It's possible that I'm just not getting it, but it would appear that
the pseudo-code for #whileTrue; and #whileFalse: is incorrect. Even
if I were right, it is still the height of pedantry on my part to
call this a bug, since the code is never executed due to compiler
inlining. Nevertheless, perhaps it would be more aesthetically
pleasing to have pseudo-code here that would work if the compiler did
not inline loops?
The present code in BlockContext is:
> "Ordinarily compiled in-line, and therefore not overridable.
> This is in case the message is sent to other than a literal block.
> Evaluate the argument, aBlock, as long as the value of the
>receiver is true."
> ^ [self value] whileTrue: [aBlock value]
But it would appear to me that this code would infinite loop for so
long as these valuations do not result in a walkback. In either case
the behavior appears both undefined and incorrect for most
BlockContext instances and arguments. Perhaps something like the
following would yield the desired result?
^ self value ifTrue: [aBlock value. self whileTrue: aBlock]
(and in the case of #whileFalse, use #ifFalse instead).
More information about the Squeak-dev