RETURN_HOOK communicates the number of returned values
authorAndy Wingo <wingo@pobox.com>
Wed, 13 Jan 2010 22:14:12 +0000 (23:14 +0100)
committerAndy Wingo <wingo@pobox.com>
Wed, 13 Jan 2010 22:14:12 +0000 (23:14 +0100)
* 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.

libguile/vm-engine.h
libguile/vm-i-system.c

index 51c462c..ccc1408 100644 (file)
  */
 
 #undef RUN_HOOK
+#undef RUN_HOOK1
 #if VM_USE_HOOKS
 #define RUN_HOOK(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
 #define RUN_HOOK(h)
+#define RUN_HOOK1(h, x)
 #endif
 
 #define BOOT_HOOK()    RUN_HOOK (SCM_VM_BOOT_HOOK)
 #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 ())
index 2e1dae9..8297c5b 100644 (file)
@@ -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;