diff options
author | Andy Wingo <wingo@pobox.com> | 2013-05-23 15:07:37 +0200 |
---|---|---|
committer | Andy Wingo <wingo@pobox.com> | 2013-05-27 07:13:13 +0200 |
commit | c850a0ff4d0073364612ff5785bda8217ea9ae7f (patch) | |
tree | 82d3ce7de2f7eee2f0940eb72b502d2038ab1569 /libguile/vm.c | |
parent | 27319ffaa90dc5789843d8b80842b9a6d36120e1 (diff) | |
download | guile-c850a0ff4d0073364612ff5785bda8217ea9ae7f.tar.gz |
pop-continuation abort-continuation hooks pass return vals directly
* doc/ref/api-debug.texi (VM Hooks): Update documentation.
* libguile/vm.c (vm_dispatch_hook):
* libguile/vm-engine.c: Rework the hook machinery so that they can
receive an arbitrary number of arguments. The return and abort
hooks will pass the values that they return to their continuations.
(vm_engine): Adapt to ABORT_CONTINUATION_HOOK change.
* libguile/vm-i-system.c (return, return/values): Adapt to
POP_CONTINUATION_HOOK change.
* module/system/vm/frame.scm (frame-return-values): Remove. The
pop-continuation-hook will pass the values directly.
* module/system/vm/trace.scm (print-return):
(trace-calls-to-procedure):
(trace-calls-in-procedure): Update to receive return values
directly.
* module/system/vm/traps.scm (trap-in-procedure)
(trap-in-dynamic-extent): Ignore return values.
(trap-frame-finish, trap-calls-in-dynamic-extent)
(trap-calls-to-procedure): Pass return values to the handlers.
Diffstat (limited to 'libguile/vm.c')
-rw-r--r-- | libguile/vm.c | 31 |
1 files changed, 27 insertions, 4 deletions
diff --git a/libguile/vm.c b/libguile/vm.c index 0b0650d0f..f80d6071b 100644 --- a/libguile/vm.c +++ b/libguile/vm.c @@ -202,14 +202,16 @@ 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_hook (SCM vm, int hook_num) +vm_dispatch_hook (SCM vm, int hook_num, SCM *argv, int n) { struct scm_vm *vp; SCM hook; struct scm_frame c_frame; scm_t_cell *frame; - SCM args[1]; int saved_trace_level; vp = SCM_VM_DATA (vm); @@ -242,9 +244,30 @@ vm_dispatch_hook (SCM vm, int hook_num) frame->word_0 = SCM_PACK (scm_tc7_frame); frame->word_1 = SCM_PACK_POINTER (&c_frame); - args[0] = SCM_PACK_POINTER (frame); - scm_c_run_hookn (hook, args, 1); + if (n == 0) + { + SCM args[1]; + + args[0] = SCM_PACK_POINTER (frame); + scm_c_run_hookn (hook, args, 1); + } + else if (n == 1) + { + SCM args[2]; + + args[0] = SCM_PACK_POINTER (frame); + args[1] = argv[0]; + scm_c_run_hookn (hook, args, 2); + } + else + { + SCM args = SCM_EOL; + + while (n--) + args = scm_cons (argv[n], args); + scm_c_run_hook (hook, scm_cons (SCM_PACK_POINTER (frame), args)); + } vp->trace_level = saved_trace_level; } |