1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-05-20 11:40:18 +02:00

RETURN_HOOK communicates the number of returned values

* libguile/vm-engine.h (RUN_HOOK1): Add some machinery whereby a hook
  can push an arg on the stack, run the hook, then drop the value.
  (RETURN_HOOK): Use it here, so we push the number of returned values.

* libguile/vm-i-system.c (return, return-values): Adapt to RETURN_HOOK
  changes.
This commit is contained in:
Andy Wingo 2010-01-13 23:14:12 +01:00
parent 7e9f96021a
commit 45cc48673a
2 changed files with 15 additions and 3 deletions

View file

@ -195,6 +195,7 @@
*/ */
#undef RUN_HOOK #undef RUN_HOOK
#undef RUN_HOOK1
#if VM_USE_HOOKS #if VM_USE_HOOKS
#define RUN_HOOK(h) \ #define RUN_HOOK(h) \
{ \ { \
@ -204,8 +205,19 @@
vm_dispatch_hook (vm, h); \ vm_dispatch_hook (vm, h); \
} \ } \
} }
#define RUN_HOOK1(h, x) \
{ \
if (SCM_UNLIKELY (vp->trace_level > 0)) \
{ \
PUSH (x); \
SYNC_REGISTER (); \
vm_dispatch_hook (vm, h); \
DROP(); \
} \
}
#else #else
#define RUN_HOOK(h) #define RUN_HOOK(h)
#define RUN_HOOK1(h, x)
#endif #endif
#define BOOT_HOOK() RUN_HOOK (SCM_VM_BOOT_HOOK) #define BOOT_HOOK() RUN_HOOK (SCM_VM_BOOT_HOOK)
@ -215,7 +227,7 @@
#define ENTER_HOOK() RUN_HOOK (SCM_VM_ENTER_HOOK) #define ENTER_HOOK() RUN_HOOK (SCM_VM_ENTER_HOOK)
#define APPLY_HOOK() RUN_HOOK (SCM_VM_APPLY_HOOK) #define APPLY_HOOK() RUN_HOOK (SCM_VM_APPLY_HOOK)
#define EXIT_HOOK() RUN_HOOK (SCM_VM_EXIT_HOOK) #define EXIT_HOOK() RUN_HOOK (SCM_VM_EXIT_HOOK)
#define RETURN_HOOK() RUN_HOOK (SCM_VM_RETURN_HOOK) #define RETURN_HOOK(n) RUN_HOOK1 (SCM_VM_RETURN_HOOK, SCM_I_MAKINUM (n))
#define VM_HANDLE_INTERRUPTS \ #define VM_HANDLE_INTERRUPTS \
SCM_ASYNC_TICK_WITH_CODE (SYNC_REGISTER ()) SCM_ASYNC_TICK_WITH_CODE (SYNC_REGISTER ())

View file

@ -1123,7 +1123,7 @@ VM_DEFINE_INSTRUCTION (63, return, "return", 0, 1, 1)
{ {
vm_return: vm_return:
EXIT_HOOK (); EXIT_HOOK ();
RETURN_HOOK (); RETURN_HOOK (1);
VM_HANDLE_INTERRUPTS; VM_HANDLE_INTERRUPTS;
@ -1163,7 +1163,7 @@ VM_DEFINE_INSTRUCTION (64, return_values, "return/values", 1, -1, -1)
nvalues = FETCH (); nvalues = FETCH ();
vm_return_values: vm_return_values:
EXIT_HOOK (); EXIT_HOOK ();
RETURN_HOOK (); RETURN_HOOK (nvalues);
VM_HANDLE_INTERRUPTS; VM_HANDLE_INTERRUPTS;