summaryrefslogtreecommitdiff
path: root/libguile/vm.c
diff options
context:
space:
mode:
authorAndy Wingo <wingo@pobox.com>2013-11-19 22:14:20 +0100
committerAndy Wingo <wingo@pobox.com>2013-11-19 22:14:20 +0100
commitea0cd17d11fb73f79842c03b49df5c7aef4b36eb (patch)
treecf32222eaa7b831ae13be432a923a2b4091fb0f0 /libguile/vm.c
parentc4f7923fa9148204c7237e400c6e69056b69d4b2 (diff)
downloadguile-ea0cd17d11fb73f79842c03b49df5c7aef4b36eb.tar.gz
Rework hook dispatch mechanism
* libguile/vm-engine.c (RUN_HOOK, RUN_HOOK0, RUN_HOOK1): Rework to dispatch through specific per-hook procedures. Might reduce register pressure in the VM. * libguile/vm.c (vm_dispatch_apply_hook): (vm_dispatch_push_continuation_hook): (vm_dispatch_pop_continuation_hook): (vm_dispatch_next_hook): (vm_dispatch_abort_hook): (vm_dispatch_restore_continuation_hook): New internal helpers.
Diffstat (limited to 'libguile/vm.c')
-rw-r--r--libguile/vm.c40
1 files changed, 38 insertions, 2 deletions
diff --git a/libguile/vm.c b/libguile/vm.c
index 5aaf62499..125501ee9 100644
--- a/libguile/vm.c
+++ b/libguile/vm.c
@@ -168,8 +168,12 @@ scm_i_capture_current_stack (void)
0);
}
-static void vm_dispatch_hook (SCM vm, int hook_num,
- SCM *argv, int n) SCM_NOINLINE;
+static void vm_dispatch_apply_hook (SCM vm) SCM_NOINLINE;
+static void vm_dispatch_push_continuation_hook (SCM vm) SCM_NOINLINE;
+static void vm_dispatch_pop_continuation_hook (SCM vm, SCM *old_fp) SCM_NOINLINE;
+static void vm_dispatch_next_hook (SCM vm) SCM_NOINLINE;
+static void vm_dispatch_abort_hook (SCM vm) SCM_NOINLINE;
+static void vm_dispatch_restore_continuation_hook (SCM vm) SCM_NOINLINE;
static void
vm_dispatch_hook (SCM vm, int hook_num, SCM *argv, int n)
@@ -239,6 +243,38 @@ vm_dispatch_hook (SCM vm, int hook_num, SCM *argv, int n)
}
static void
+vm_dispatch_apply_hook (SCM vm)
+{
+ return vm_dispatch_hook (vm, SCM_VM_APPLY_HOOK, NULL, 0);
+}
+static void vm_dispatch_push_continuation_hook (SCM vm)
+{
+ return vm_dispatch_hook (vm, SCM_VM_PUSH_CONTINUATION_HOOK, NULL, 0);
+}
+static void vm_dispatch_pop_continuation_hook (SCM vm, SCM *old_fp)
+{
+ struct scm_vm *vp = SCM_VM_DATA (vm);
+ return vm_dispatch_hook (vm, SCM_VM_POP_CONTINUATION_HOOK,
+ &SCM_FRAME_LOCAL (old_fp, 1),
+ SCM_FRAME_NUM_LOCALS (old_fp, vp->sp) - 1);
+}
+static void vm_dispatch_next_hook (SCM vm)
+{
+ return vm_dispatch_hook (vm, SCM_VM_NEXT_HOOK, NULL, 0);
+}
+static void vm_dispatch_abort_hook (SCM vm)
+{
+ struct scm_vm *vp = SCM_VM_DATA (vm);
+ return vm_dispatch_hook (vm, SCM_VM_ABORT_CONTINUATION_HOOK,
+ &SCM_FRAME_LOCAL (vp->fp, 1),
+ SCM_FRAME_NUM_LOCALS (vp->fp, vp->sp) - 1);
+}
+static void vm_dispatch_restore_continuation_hook (SCM vm)
+{
+ return vm_dispatch_hook (vm, SCM_VM_RESTORE_CONTINUATION_HOOK, NULL, 0);
+}
+
+static void
vm_abort (SCM vm, SCM tag, size_t nstack, SCM *stack_args, SCM tail, SCM *sp,
scm_i_jmp_buf *current_registers) SCM_NORETURN;