summaryrefslogtreecommitdiff
path: root/libguile/vm-engine.c
diff options
context:
space:
mode:
authorAndy Wingo <wingo@pobox.com>2018-06-26 10:57:23 +0200
committerAndy Wingo <wingo@pobox.com>2018-06-26 11:09:36 +0200
commit5e8e816c61f99ef1d96ad186d949659bf3aa8853 (patch)
treeda62e39049d3bee7a311757e309428cb20e80b46 /libguile/vm-engine.c
parent3b6bf20ef5d7d0de34de4fb7ba9777af29ba55ae (diff)
downloadguile-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/vm-engine.c')
-rw-r--r--libguile/vm-engine.c9
1 files changed, 2 insertions, 7 deletions
diff --git a/libguile/vm-engine.c b/libguile/vm-engine.c
index 8e863827d..dcbd96eb0 100644
--- a/libguile/vm-engine.c
+++ b/libguile/vm-engine.c
@@ -650,7 +650,7 @@ VM_NAME (scm_i_thread *thread, jmp_buf *registers, int resume)
ALLOC_FRAME (3);
SP_SET (1, ret);
- SP_SET (0, scm_from_int (err));
+ SP_SET (0, scm_vm_intrinsics.s64_to_scm (err));
NEXT (1);
}
@@ -674,12 +674,7 @@ VM_NAME (scm_i_thread *thread, jmp_buf *registers, int resume)
SCM_PROGRAM_FREE_VARIABLE_REF (FP_REF (0), contregs_idx);
SYNC_IP ();
- scm_i_check_continuation (contregs);
- vm_return_to_continuation (scm_i_contregs_vp (contregs),
- scm_i_contregs_vm_cont (contregs),
- FRAME_LOCALS_COUNT_FROM (1),
- sp);
- scm_i_reinstate_continuation (contregs);
+ scm_vm_intrinsics.reinstate_continuation_x (thread, contregs);
/* no NEXT */
abort ();