summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndy Wingo <wingo@pobox.com>2010-01-13 23:14:12 +0100
committerAndy Wingo <wingo@pobox.com>2010-01-13 23:14:12 +0100
commit45cc48673a75c8318d2e6ca3651d94e64a08ad47 (patch)
treeb6ddba50741bbe12faf8ba4ff918573ec19dbaf3
parent7e9f96021ac200f2fe5b25f4e02bd11b3331fb34 (diff)
downloadguile-45cc48673a75c8318d2e6ca3651d94e64a08ad47.tar.gz
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.
-rw-r--r--libguile/vm-engine.h14
-rw-r--r--libguile/vm-i-system.c4
2 files changed, 15 insertions, 3 deletions
diff --git a/libguile/vm-engine.h b/libguile/vm-engine.h
index 51c462c43..ccc1408d9 100644
--- a/libguile/vm-engine.h
+++ b/libguile/vm-engine.h
@@ -195,6 +195,7 @@
*/
#undef RUN_HOOK
+#undef RUN_HOOK1
#if VM_USE_HOOKS
#define RUN_HOOK(h) \
{ \
@@ -204,8 +205,19 @@
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
#define RUN_HOOK(h)
+#define RUN_HOOK1(h, x)
#endif
#define BOOT_HOOK() RUN_HOOK (SCM_VM_BOOT_HOOK)
@@ -215,7 +227,7 @@
#define ENTER_HOOK() RUN_HOOK (SCM_VM_ENTER_HOOK)
#define APPLY_HOOK() RUN_HOOK (SCM_VM_APPLY_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 \
SCM_ASYNC_TICK_WITH_CODE (SYNC_REGISTER ())
diff --git a/libguile/vm-i-system.c b/libguile/vm-i-system.c
index 2e1dae9d0..8297c5b0e 100644
--- a/libguile/vm-i-system.c
+++ b/libguile/vm-i-system.c
@@ -1123,7 +1123,7 @@ VM_DEFINE_INSTRUCTION (63, return, "return", 0, 1, 1)
{
vm_return:
EXIT_HOOK ();
- RETURN_HOOK ();
+ RETURN_HOOK (1);
VM_HANDLE_INTERRUPTS;
@@ -1163,7 +1163,7 @@ VM_DEFINE_INSTRUCTION (64, return_values, "return/values", 1, -1, -1)
nvalues = FETCH ();
vm_return_values:
EXIT_HOOK ();
- RETURN_HOOK ();
+ RETURN_HOOK (nvalues);
VM_HANDLE_INTERRUPTS;