Luke Palmer <[EMAIL PROTECTED]> wrote:
> Jeff Clites writes:
>> a = 1
>> foo()
>> print a
>> b = 10
>> return b
>>
>> It would seem (w/o continuations) that b should be able to re-use a's
>> register, but if it does then we'll print 10 instead of 1 "the second
>> time".
> It can. You can't reuse the same PMC (if you're using PMCs), but you
> can reuse the register.
No. With the presence of a continuation the "print a" can be executed
twice. If now C<b = 10> reuses a's register, it'll break.
> It all comes down to how the code is generated. I've done this in a
> project of mine, and it takes a little thought, but it works. When you
> take a continuation, you have to saveall before you take it, and
> restoreall at the point where the continuation is to resume.
Please forget C<saveall>. This was the way to go before we had register
frames.
> This is the trick I used (modulo brain code rot--I haven't written PIR
> in a really long time):
> saveall
> $P0 = new Continuation
> set_addr $P0, RESUME
> save $P0
> restoreall
> restore $P0
Sure. That's what we formerly used to do. Two memcpys � 640 bytes + 2
stack operations. The memcpys were killing performance.
This isn't needed anymore. A continuation does restore the register
frame. In your code above you emit all possible code to do the rigth
thing. I'm proposing a much simpler syntax:
RESUMABLE: foo()
# code here might be executed more then once
> Luke
leo