diff options
author | Andy Wingo <wingo@pobox.com> | 2010-02-07 14:50:51 +0100 |
---|---|---|
committer | Andy Wingo <wingo@pobox.com> | 2010-02-08 13:35:42 +0100 |
commit | 269479e31f70d40a82b75be87c1b2a7363c85696 (patch) | |
tree | 8b8f8603e0a5610de57c1258dae7b8e89aa7139b /libguile/continuations.c | |
parent | 997659f898d94abccdcba3c444b84e3c6f6e963e (diff) | |
download | guile-269479e31f70d40a82b75be87c1b2a7363c85696.tar.gz |
scm_i_make_continuation takes vm and vm_cont args explicitly
* libguile/continuations.h:
* libguile/continuations.c (scm_i_make_continuation): Take VM and VM
continuation arguments as well; I'm not convinced that saving all VM
continuations was the right thing, and in any case we only ever saved
the latest. Running a new VM should create a continuation barrier.
* libguile/stacks.c (scm_make_stack):
* libguile/vm-i-system.c (call/cc, tail-call/cc): Adapt callers.
* libguile/vm.h (scm_i_vm_capture_continuation)
(scm_i_vm_reinstate_continuation): Change to be internal, and to only
capture and reinstate continuations for a particular VM.
Diffstat (limited to 'libguile/continuations.c')
-rw-r--r-- | libguile/continuations.c | 17 |
1 files changed, 8 insertions, 9 deletions
diff --git a/libguile/continuations.c b/libguile/continuations.c index 6caceca53..fc47d9b40 100644 --- a/libguile/continuations.c +++ b/libguile/continuations.c @@ -191,7 +191,7 @@ continuation_print (SCM obj, SCM port, scm_print_state *state SCM_UNUSED) continuation. */ #define FUNC_NAME "scm_i_make_continuation" SCM -scm_i_make_continuation (int *first) +scm_i_make_continuation (int *first, SCM vm, SCM vm_cont) { scm_i_thread *thread = SCM_I_CURRENT_THREAD; SCM cont; @@ -214,7 +214,8 @@ scm_i_make_continuation (int *first) #endif continuation->offset = continuation->stack - src; memcpy (continuation->stack, src, sizeof (SCM_STACKITEM) * stack_size); - continuation->vm_conts = scm_vm_capture_continuations (); + continuation->vm = vm; + continuation->vm_cont = vm_cont; SCM_NEWSMOB (cont, tc16_continuation, continuation); @@ -265,13 +266,10 @@ scm_i_continuation_to_frame (SCM continuation) contregs = scm_c_vector_ref (scm_program_objects (continuation), 0); cont = SCM_CONTREGS (contregs); - if (!scm_is_null (cont->vm_conts)) + if (scm_is_true (cont->vm_cont)) { - SCM vm_cont; - struct scm_vm_cont *data; - vm_cont = scm_cdr (scm_car (cont->vm_conts)); - data = SCM_VM_CONT_DATA (vm_cont); - return scm_c_make_frame (vm_cont, + struct scm_vm_cont *data = SCM_VM_CONT_DATA (cont->vm_cont); + return scm_c_make_frame (cont->vm_cont, data->fp + data->reloc, data->sp + data->reloc, data->ip, @@ -334,7 +332,8 @@ copy_stack (void *data) copy_stack_data *d = (copy_stack_data *)data; memcpy (d->dst, d->continuation->stack, sizeof (SCM_STACKITEM) * d->continuation->num_stack_items); - scm_vm_reinstate_continuations (d->continuation->vm_conts); + scm_i_vm_reinstate_continuation (d->continuation->vm, + d->continuation->vm_cont); #ifdef __ia64__ SCM_I_CURRENT_THREAD->pending_rbs_continuation = d->continuation; #endif |