diff options
Diffstat (limited to 'libguile/vm.c')
-rw-r--r-- | libguile/vm.c | 40 |
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; |