Jeff Clites writes:
> On Nov 14, 2004, at 3:03 AM, Leopold Toetsch wrote:
>
> >Matt Fowles <[EMAIL PROTECTED]> wrote:
> >
> >>Yes, but in the case of the continuation resuming after foo, the
> >>continuation should restore the frame to the point where it was taken.
> >> Thus all of the registers will be exactly as they were when the
> >>continuation was taken (i.e. in the correct place).
> >
> >Yes, but Jeff's example wasn't really reflecting the problem.
>
> How come? (Not quibbling--just afraid I'm missing something.) It seems
> that even this function body shows the problem:
>
> 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.
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.
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
# ... $P0 is your continuation
RESUME:
restoreall
# ...
On the other hand, this may be completely irrelavent, since I haven't
been following the discussion.
Luke