[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Guile-commits] 20/26: Add intrinsic for call/cc
From: |
Andy Wingo |
Subject: |
[Guile-commits] 20/26: Add intrinsic for call/cc |
Date: |
Tue, 26 Jun 2018 11:26:14 -0400 (EDT) |
wingo pushed a commit to branch master
in repository guile.
commit ba23bc12fdfec34dc76b71086b72d38e9c78f21f
Author: Andy Wingo <address@hidden>
Date: Tue Jun 26 12:01:01 2018 +0200
Add intrinsic for call/cc
* libguile/intrinsics.h: Add "capture-continuation" intrinsic.
* libguile/vm-engine.c (call/cc): Rework to use capture_continuation
intrinsic.
* libguile/vm.c (capture_continuation): New intrinsic.
---
libguile/intrinsics.h | 4 ++++
libguile/vm-engine.c | 12 ++----------
libguile/vm.c | 15 +++++++++++++++
3 files changed, 21 insertions(+), 10 deletions(-)
diff --git a/libguile/intrinsics.h b/libguile/intrinsics.h
index 434aad3..aa24241 100644
--- a/libguile/intrinsics.h
+++ b/libguile/intrinsics.h
@@ -24,6 +24,8 @@
#error intrinsics.h is private and uninstalled
#endif
+#include <setjmp.h>
+
#include <libguile/scm.h>
@@ -52,6 +54,7 @@ typedef void (*scm_t_thread_u32_u32_scm_u8_u8_intrinsic)
(scm_thread*, uint32_t,
typedef SCM (*scm_t_scm_from_scm_scm_scmp_sp_intrinsic) (SCM, SCM, SCM*,
const union
scm_vm_stack_element*);
typedef void (*scm_t_thread_scm_noreturn_intrinsic) (scm_thread*, SCM)
SCM_NORETURN;
+typedef SCM (*scm_t_scm_from_thread_regs_intrinsic) (scm_thread*, jmp_buf*);
#define SCM_FOR_ALL_VM_INTRINSICS(M) \
M(scm_from_scm_scm, add, "add", ADD) \
@@ -103,6 +106,7 @@ typedef void (*scm_t_thread_scm_noreturn_intrinsic)
(scm_thread*, SCM) SCM_NORET
M(thread, push_interrupt_frame, "push-interrupt-frame",
PUSH_INTERRUPT_FRAME) \
M(scm_from_scm_scm_scmp_sp, foreign_call, "foreign-call", FOREIGN_CALL) \
M(thread_scm_noreturn, reinstate_continuation_x, "reinstate-continuation!",
REINSTATE_CONTINUATION_X) \
+ M(scm_from_thread_regs, capture_continuation, "capture-continuation",
CAPTURE_CONTINUATION) \
/* Add new intrinsics here; also update scm_bootstrap_intrinsics. */
enum scm_vm_intrinsic
diff --git a/libguile/vm-engine.c b/libguile/vm-engine.c
index 920cf1f..3b46a6f 100644
--- a/libguile/vm-engine.c
+++ b/libguile/vm-engine.c
@@ -756,18 +756,10 @@ VM_NAME (scm_thread *thread, jmp_buf *registers, int
resume)
*/
VM_DEFINE_OP (15, call_cc, "call/cc", OP1 (X32))
{
- SCM vm_cont, cont;
- scm_t_dynstack *dynstack;
+ SCM cont;
SYNC_IP ();
- dynstack = scm_dynstack_capture_all (&thread->dynstack);
- vm_cont = scm_i_vm_capture_stack (VP->stack_top,
- SCM_FRAME_DYNAMIC_LINK (VP->fp),
- SCM_FRAME_PREVIOUS_SP (VP->fp),
- SCM_FRAME_RETURN_ADDRESS (VP->fp),
- dynstack,
- 0);
- cont = scm_i_make_continuation (registers, thread, vm_cont);
+ cont = scm_vm_intrinsics.capture_continuation (thread, registers);
RESET_FRAME (2);
diff --git a/libguile/vm.c b/libguile/vm.c
index 7c30104..662b3d6 100644
--- a/libguile/vm.c
+++ b/libguile/vm.c
@@ -1298,6 +1298,20 @@ reinstate_continuation_x (scm_thread *thread, SCM cont)
scm_i_reinstate_continuation (cont);
}
+static SCM
+capture_continuation (scm_thread *thread, jmp_buf *registers)
+{
+ struct scm_vm *vp = &thread->vm;
+ SCM vm_cont =
+ scm_i_vm_capture_stack (vp->stack_top,
+ SCM_FRAME_DYNAMIC_LINK (vp->fp),
+ SCM_FRAME_PREVIOUS_SP (vp->fp),
+ SCM_FRAME_RETURN_ADDRESS (vp->fp),
+ scm_dynstack_capture_all (&thread->dynstack),
+ 0);
+ return scm_i_make_continuation (registers, thread, vm_cont);
+}
+
SCM
scm_call_n (SCM proc, SCM *argv, size_t nargs)
{
@@ -1642,6 +1656,7 @@ scm_bootstrap_vm (void)
scm_vm_intrinsics.bind_kwargs = bind_kwargs;
scm_vm_intrinsics.push_interrupt_frame = push_interrupt_frame;
scm_vm_intrinsics.reinstate_continuation_x = reinstate_continuation_x;
+ scm_vm_intrinsics.capture_continuation = capture_continuation;
sym_vm_run = scm_from_latin1_symbol ("vm-run");
sym_vm_error = scm_from_latin1_symbol ("vm-error");
- [Guile-commits] branch master updated (1234bb1 -> 51e71a4), Andy Wingo, 2018/06/26
- [Guile-commits] 05/26: Add __scm.h placeholder, Andy Wingo, 2018/06/26
- [Guile-commits] 04/26: Deprecate scm_t_uint8 and similar typedefs, Andy Wingo, 2018/06/26
- [Guile-commits] 09/26: Fix intrinsics copyright line and include guards, Andy Wingo, 2018/06/26
- [Guile-commits] 07/26: Eagerly initialize thread VM; remove scm_the_vm, Andy Wingo, 2018/06/26
- [Guile-commits] 06/26: Inline struct scm_vm into struct scm_i_thread, Andy Wingo, 2018/06/26
- [Guile-commits] 03/26: Use ptrdiff_t instead of scm_t_ptrdiff, Andy Wingo, 2018/06/26
- [Guile-commits] 10/26: expand_stack intrinsic takes thread, Andy Wingo, 2018/06/26
- [Guile-commits] 01/26: Start to use C99 stdint in gen-scmconfig, Andy Wingo, 2018/06/26
- [Guile-commits] 08/26: VM gets VP from thread, Andy Wingo, 2018/06/26
- [Guile-commits] 20/26: Add intrinsic for call/cc,
Andy Wingo <=
- [Guile-commits] 18/26: Refactor continuation capture in VM, Andy Wingo, 2018/06/26
- [Guile-commits] 17/26: Foreign-call intrinsic boxes errno, Andy Wingo, 2018/06/26
- [Guile-commits] 25/26: Optimize abort-to-prompt to avoid alloca, Andy Wingo, 2018/06/26
- [Guile-commits] 15/26: Most header files use forward decl for union scm_vm_stack_element, Andy Wingo, 2018/06/26
- [Guile-commits] 14/26: Add intrinsic for foreign-call, Andy Wingo, 2018/06/26
- [Guile-commits] 11/26: Move VM keyword argument parsing to happen via an intrinsic, Andy Wingo, 2018/06/26
- [Guile-commits] 22/26: Add rest-arg-length intrinsic., Andy Wingo, 2018/06/26
- [Guile-commits] 16/26: Reinstating undelimited continuations uses intrinsic, Andy Wingo, 2018/06/26
- [Guile-commits] 24/26: Refactors to abort-to-prompt implementation, Andy Wingo, 2018/06/26
- [Guile-commits] 12/26: Add push-interrupt-frame VM intrinsic, Andy Wingo, 2018/06/26