diff options
author | Andy Wingo <wingo@pobox.com> | 2018-06-26 10:57:23 +0200 |
---|---|---|
committer | Andy Wingo <wingo@pobox.com> | 2018-06-26 11:09:36 +0200 |
commit | 5e8e816c61f99ef1d96ad186d949659bf3aa8853 (patch) | |
tree | da62e39049d3bee7a311757e309428cb20e80b46 /libguile/continuations.c | |
parent | 3b6bf20ef5d7d0de34de4fb7ba9777af29ba55ae (diff) | |
download | guile-5e8e816c61f99ef1d96ad186d949659bf3aa8853.tar.gz |
Reinstating undelimited continuations uses intrinsic
* libguile/continuations.h (scm_t_contregs): Remove "struct vm*" member;
unneeded.
* libguile/continuations.c (scm_i_make_continuation): No need to store
continuation->vp.
(scm_i_contregs): New internal function, replaces scm_i_contregs_vp
and scm_i_contregs_vm_cont.
(scm_i_check_continuation): Remove; moved to vm.c.
(scm_i_reinstate_continuation): Add an abort(), to satisfy
SCM_NORETURN.
* libguile/intrinsics.h: Add new "reinstate-continuation!" intrinsic.
* libguile/vm-engine.c (continuation-call): Use new
reinstate-continuation! intrinsic.
* libguile/vm.c (vm_return_to_continuation_inner): Move later in the
file.
(reinstate_continuation_x): New intrinsic.
(scm_bootstrap_vm): Init new intrinsic.
Diffstat (limited to 'libguile/continuations.c')
-rw-r--r-- | libguile/continuations.c | 29 |
1 files changed, 6 insertions, 23 deletions
diff --git a/libguile/continuations.c b/libguile/continuations.c index 6446a565b..c99e0eb43 100644 --- a/libguile/continuations.c +++ b/libguile/continuations.c @@ -193,7 +193,6 @@ scm_i_make_continuation (int *first, struct scm_vm *vp, SCM vm_cont) #endif continuation->offset = continuation->stack - src; memcpy (continuation->stack, src, sizeof (SCM_STACKITEM) * stack_size); - continuation->vp = vp; continuation->vm_cont = vm_cont; saved_cookie = vp->resumable_prompt_cookie; capture_auxiliary_stack (thread, continuation); @@ -236,16 +235,13 @@ scm_i_continuation_to_frame (SCM continuation, struct scm_frame *frame) return 0; } -struct scm_vm * -scm_i_contregs_vp (SCM contregs) +scm_t_contregs * +scm_i_contregs (SCM contregs) { - return SCM_CONTREGS (contregs)->vp; -} + if (!SCM_CONTREGSP (contregs)) + abort (); -SCM -scm_i_contregs_vm_cont (SCM contregs) -{ - return SCM_CONTREGS (contregs)->vm_cont; + return SCM_CONTREGS (contregs); } @@ -336,24 +332,11 @@ scm_dynthrow (SCM cont) copy_stack_and_call (continuation, dst); } - -void -scm_i_check_continuation (SCM cont) -{ - scm_i_thread *thread = SCM_I_CURRENT_THREAD; - scm_t_contregs *continuation = SCM_CONTREGS (cont); - - if (!scm_is_eq (continuation->root, thread->continuation_root)) - scm_misc_error - ("%continuation-call", - "invoking continuation would cross continuation barrier: ~A", - scm_list_1 (cont)); -} - void scm_i_reinstate_continuation (SCM cont) { scm_dynthrow (cont); + abort (); /* Unreachable. */ } SCM |