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:
whileTrue: aBlock "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).