arning at charm.net
Sun Jan 7 03:40:34 UTC 2001
On Sat, 06 Jan 2001 16:47:21 -0600 Mark van Gulik <ghoul6 at home.net> wrote:
>> !BlockContext methodsFor: 'controlling' stamp: 'RAA 1/5/2001 23:10'!
>> | loopAgain |
>> "Evaluate the receiver repeatedly, ending only if the block explicitly
>> loopAgain _ thisContext pc.
>> self value.
>> thisContext jumpTo: loopAgain stack: 1.
>> self halt.
>> ! !
>That's interesting, I was intially worried about the stack depths not
>corresponding too. On a guess I'd say it failed some time around the 12th
>iteration (from my recollection of the short context size). Did you ever
>crash the VM with such a test?
Nope, although some of the walkbacks looked rather odd.
>Anyhow, this is fixed by using #realPc
>above. Then the call site to #realPc is expecting one value on the stack,
>which matches the call site to #jumpTo:.
Thanks for explaining that. I did this without examining exactly what tricks the compiler/VM were using (I wasn't up for the headaches). I just tried things that ought to work and threw away those that didn't.
>> loopAgain _ thisContext pc + 5. "5 is the size of the bytecodes for this
>Hm, that was a bit kludgy.
Yep, that was a performance tweak that your #realPC handles much better.
>> !BlockContext methodsFor: 'controlling' stamp: 'RAA 1/4/2001 10:21'!
>> whileTrue4: aBlock
>> | x |
>> x _ 0.
>> [(x _ x + 1) < 100] whileTrue4: [Transcript show: x printString; cr].
>> self value ifFalse: [^self].
>> aBlock value.
>> ] repeatEndlessly
>> ! !
>This is the cleanest implementation. My vote is to add special compiler
>support for #repeatEndlessly (VisualWorks calls it #repeat), and have
>special compiler support for it. Then the #whileTrue: operations don't need
>to have bodies that look recursive. Instead, they can appear to invoke
>#repeatEndlessly (but really be implemented with branch bytecodes because of
>the way #repeatEndlessly is handled by the compiler). The implementation of
>#repeatEndlessly can use #restart or whatever, as it only makes a
>performance difference if you send a non-literal block the #repeatEndlessly
>message (which is very easy to avoid).
My vote, too, if we decide this is broken enough to warrant fixing. WRT #repeatEndlessly, I picked that since #repeat was already used and relies on, guess what?, #whileTrue. If this change is accepted, then we could use either or pick something else.
More information about the Squeak-dev