be more like the interpreter in signalling wrong-num-args
authorAndy Wingo <wingo@pobox.com>
Thu, 2 Oct 2008 09:00:55 +0000 (11:00 +0200)
committerAndy Wingo <wingo@pobox.com>
Thu, 2 Oct 2008 09:00:55 +0000 (11:00 +0200)
* libguile/vm-engine.c: Call scm_wrong_num_args in the wrong-num-args
  case, to be more like the interpreter.

* libguile/vm-engine.h (ASSERT): New macro.

* libguile/vm-i-system.c (apply, goto/apply): Assert that nargs >= 2,
  because the compiler should always feed us correct instructions.
  (call/cc): If no values are returned to the continuation, signal
  no_values instead of wrong_num_args.

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

index 86b19de..4436e7b 100644 (file)
@@ -151,8 +151,9 @@ vm_run (SCM vm, SCM program, SCM args)
     goto vm_error;
 
   vm_error_wrong_num_args:
-    err_msg  = scm_from_locale_string ("VM: Wrong number of arguments");
-    err_args = SCM_EOL;
+    /* nargs and program are valid */
+    scm_wrong_num_args (program);
+    /* shouldn't get here */
     goto vm_error;
 
   vm_error_wrong_type_apply:
index 936bbb4..a7e162d 100644 (file)
  * Cache/Sync
  */
 
+#define ENABLE_ASSERTIONS
+
+#ifdef ENABLE_ASSERTIONS
+# define ASSERT(condition) if (SCM_UNLIKELY (!(condition))) abort()
+#else
+# define ASSERT(condition)
+#endif
+
+
 #define CACHE_REGISTER()                       \
 {                                              \
   ip = vp->ip;                                 \
index db6d0a7..9a0e028 100644 (file)
@@ -840,8 +840,7 @@ VM_DEFINE_INSTRUCTION (apply, "apply", 1, -1, 1)
   POP (ls);
 
   nargs = FETCH ();
-  if (nargs < 2)
-    goto vm_error_wrong_num_args;
+  ASSERT (nargs >= 2);
 
   len = scm_ilength (ls);
   if (len < 0)
@@ -861,8 +860,7 @@ VM_DEFINE_INSTRUCTION (goto_apply, "goto/apply", 1, -1, 1)
   POP (ls);
 
   nargs = FETCH ();
-  if (nargs < 2)
-    goto vm_error_wrong_num_args;
+  ASSERT (nargs >= 2);
 
   len = scm_ilength (ls);
   if (len < 0)
@@ -895,7 +893,7 @@ VM_DEFINE_INSTRUCTION (call_cc, "call/cc", 0, 1, 1)
       SCM values;
       values = scm_struct_ref (cont, SCM_INUM0);
       if (SCM_NULLP (values))
-        goto vm_error_wrong_num_args;
+        goto vm_error_no_values;
       /* non-tail context does not accept multiple values? */
       PUSH (SCM_CAR (values));
       NEXT;