diff src/eval.c @ 4686:cdabd56ce1b5

Fix various small issues with the multiple-value implementation. lisp/ChangeLog addition: 2009-08-31 Aidan Kehoe <kehoea@parhasard.net> * byte-optimize.el (byte-optimize-form-code-walker): Be careful about discarding multiple values when optimising #'prog1 calls. (byte-optimize-or): Preserve any trailing nil, as this is a supported way to explicitly discard multiple values. (byte-optimize-cond-1): Discard multiple values with a singleton followed by no more clauses. * bytecomp.el (progn): (prog1): (prog2): Be careful about discarding multiple values in the byte-hunk handler of these three forms. * bytecomp.el (byte-compile-prog1, byte-compile-prog2): Don't call #'values explicitly, use `(or ,(pop form) nil) instead, since that compiles to bytecode, not a funcall. * bytecomp.el (byte-compile-values): With one non-const argument, byte-compile to `(or ,(second form) nil), not an explicit #'values call. * bytecomp.el (byte-compile-insert-header): Be nicer in the error message to emacs versions that don't understand our bytecode. src/ChangeLog addition: 2009-08-31 Aidan Kehoe <kehoea@parhasard.net> * eval.c (For, Fand): Don't declare val as REGISTER in these functions, for some reason it breaks the non-DEBUG union build. These functions are only called from interpreted code, the performance implication doesn't matter. Thank you Robert Delius Royar! * eval.c (Fmultiple_value_list_internal): Error on too many arguments. tests/ChangeLog addition: 2009-08-31 Aidan Kehoe <kehoea@parhasard.net> * automated/lisp-tests.el (Assert-rounding): Remove an overly-verbose failure message here. Correct a couple of tests which were buggy in themselves. Add three new tests, checking the behaviour of #'or and #'and when passed zero arguments, and a Known-Bug-Expect-Failure call involving letf and values. (The bug predates the C-level multiple-value implementation.)
author Aidan Kehoe <kehoea@parhasard.net>
date Sun, 06 Sep 2009 19:36:02 +0100
parents 8f1ee2d15784
children 80cd90837ac5
line wrap: on
line diff
--- a/src/eval.c	Wed Sep 02 20:38:14 2009 -0600
+++ b/src/eval.c	Sun Sep 06 19:36:02 2009 +0100
@@ -243,6 +243,7 @@
 
 Lisp_Object Qthrow;
 Lisp_Object Qobsolete_throw;
+Lisp_Object Qmultiple_value_list_internal;
 
 static int first_desired_multiple_value;
 /* Used outside this file, somewhat uncleanly, in the IGNORE_MULTIPLE_VALUES
@@ -838,7 +839,7 @@
        (args))
 {
   /* This function can GC */
-  REGISTER Lisp_Object val;
+  Lisp_Object val = Qnil;
 
   LIST_LOOP_3 (arg, args, tail)
     {
@@ -870,7 +871,7 @@
        (args))
 {
   /* This function can GC */
-  REGISTER Lisp_Object val = Qt;
+  Lisp_Object val = Qt;
 
   LIST_LOOP_3 (arg, args, tail)
     {
@@ -4795,9 +4796,16 @@
        (args))
 {
   Lisp_Object argv[4];
-  int first, upper;
+  int first, upper, nargs;
   struct gcpro gcpro1;
 
+  GET_LIST_LENGTH (args, nargs);
+  if (nargs != 3)
+    {
+      Fsignal (Qwrong_number_of_arguments,
+               list2 (Qmultiple_value_list_internal, make_int (nargs)));
+    }
+
   argv[0] = IGNORE_MULTIPLE_VALUES (Feval (XCAR (args)));
   CHECK_NATNUM (argv[0]);
   first = XINT (argv[0]);
@@ -7226,6 +7234,7 @@
   DEFSYMBOL (Qif);
   DEFSYMBOL (Qthrow);
   DEFSYMBOL (Qobsolete_throw);  
+  DEFSYMBOL (Qmultiple_value_list_internal);
 
   DEFSUBR (For);
   DEFSUBR (Fand);