Piers Cawley <[EMAIL PROTECTED]> wrote:
> Leopold Toetsch <[EMAIL PROTECTED]> writes:

>>  ... While S registers hold pointers, they have
>>  value semantics.

> Is that guaranteed? Because it probably needs to be.

It's the current implementation and tested.

>>  This would restore the register contents to the first state shown above.
>>  That is, not only I and N registers would be clobbered also S registers
>>  are involved.

> That's correct. What's the problem? Okay, you've created an infinite
> loop, but what you're describing is absolutely the correct behaviour for
> a continuation.

Ok. It's a bit mind-twisting but OTOH it's the same as setjmp/longjmp
with all implications on CPU registers. C has the volatile keyword to
avoid clobbering of a register due to a longjmp.

>>  Above code could only use P registers. Or in other words: I, N, and S
>>  registers are almost[1] useless.

> No they're not. But you should expect them to be reset if you take a
> (full) continuation back to them.

The problem I have is: do we know where registers may be reset? For
example:

    $I0 = 10
  loop:
    $P0 = shift array
    dec $I0
    if $I0 goto loop

What happens if the array PMC's C<shift> get overloaded and does some
fancy stuff with continuations. My gut feeling is that the loop might
suddenly turn into an infinite loop, depending on some code behind the
scenes ($I0 might be allocated into the preserved register range or not
depending on allocation pressure).

Second: if we don't have a notion that a continuation may capture and
restore a register frame, a compiler can hardly use any I,S,N registers
because some library code or external function might just restore these
registers.

> Presumably if foo() doesn't store a full continuation, the restoration
> just reuses an existing register frame and, if foo has made a full
> continuation its return does a restore by copying?

Yes, that should be a reasonable implementation.

leo

Reply via email to