From 4af491605c58a4033116f17be15977e9b885fdee Mon Sep 17 00:00:00 2001 From: =?utf8?q?Mattias=20Engdeg=C3=A5rd?= Date: Tue, 1 Feb 2022 20:43:15 +0100 Subject: [PATCH] ; * src/eval.c (funcall_subr): Fix last change --- src/eval.c | 98 ++++++++++++++++++++++++++++-------------------------- 1 file changed, 51 insertions(+), 47 deletions(-) diff --git a/src/eval.c b/src/eval.c index 4f1c9077511..3e648ed6216 100644 --- a/src/eval.c +++ b/src/eval.c @@ -3105,60 +3105,64 @@ Lisp_Object funcall_subr (struct Lisp_Subr *subr, ptrdiff_t numargs, Lisp_Object *args) { eassume (numargs >= 0); - /* Conforming call to finite-arity subr. */ - if (numargs >= subr->min_args && numargs <= subr->max_args) + if (numargs >= subr->min_args) { - Lisp_Object argbuf[8]; - Lisp_Object *a; - if (numargs < subr->max_args) - { - eassume (subr->max_args <= ARRAYELTS (argbuf)); - a = argbuf; - memcpy (a, args, numargs * word_size); - memclear (a + numargs, (subr->max_args - numargs) * word_size); - } - else - a = args; - switch (subr->max_args) - { - case 0: - return subr->function.a0 (); - case 1: - return subr->function.a1 (a[0]); - case 2: - return subr->function.a2 (a[0], a[1]); - case 3: - return subr->function.a3 (a[0], a[1], a[2]); - case 4: - return subr->function.a4 (a[0], a[1], a[2], a[3]); - case 5: - return subr->function.a5 (a[0], a[1], a[2], a[3], a[4]); - case 6: - return subr->function.a6 (a[0], a[1], a[2], a[3], a[4], a[5]); - case 7: - return subr->function.a7 (a[0], a[1], a[2], a[3], a[4], a[5], a[6]); - case 8: - return subr->function.a8 (a[0], a[1], a[2], a[3], a[4], a[5], a[6], - a[7]); - default: - /* If a subr takes more than 8 arguments without using MANY - or UNEVALLED, we need to extend this function to support it. - Until this is done, there is no way to call the function. */ - emacs_abort (); - } - } + /* Conforming call to finite-arity subr. */ + if (numargs <= subr->max_args) + { + Lisp_Object argbuf[8]; + Lisp_Object *a; + if (numargs < subr->max_args) + { + eassume (subr->max_args <= ARRAYELTS (argbuf)); + a = argbuf; + memcpy (a, args, numargs * word_size); + memclear (a + numargs, (subr->max_args - numargs) * word_size); + } + else + a = args; + switch (subr->max_args) + { + case 0: + return subr->function.a0 (); + case 1: + return subr->function.a1 (a[0]); + case 2: + return subr->function.a2 (a[0], a[1]); + case 3: + return subr->function.a3 (a[0], a[1], a[2]); + case 4: + return subr->function.a4 (a[0], a[1], a[2], a[3]); + case 5: + return subr->function.a5 (a[0], a[1], a[2], a[3], a[4]); + case 6: + return subr->function.a6 (a[0], a[1], a[2], a[3], a[4], a[5]); + case 7: + return subr->function.a7 (a[0], a[1], a[2], a[3], a[4], a[5], + a[6]); + case 8: + return subr->function.a8 (a[0], a[1], a[2], a[3], a[4], a[5], + a[6], a[7]); + default: + /* If a subr takes more than 8 arguments without using MANY + or UNEVALLED, we need to extend this function to support it. + Until this is done, there is no way to call the function. */ + emacs_abort (); + } + } - /* Call to n-adic subr. */ - if (subr->max_args == MANY) - return subr->function.aMANY (numargs, args); + /* Call to n-adic subr. */ + if (subr->max_args == MANY) + return subr->function.aMANY (numargs, args); + } /* Anything else is an error. */ Lisp_Object fun; XSETSUBR (fun, subr); - if (subr->max_args >= 0) - xsignal2 (Qwrong_number_of_arguments, fun, make_fixnum (numargs)); - else + if (subr->max_args == UNEVALLED) xsignal1 (Qinvalid_function, fun); + else + xsignal2 (Qwrong_number_of_arguments, fun, make_fixnum (numargs)); } /* Call the compiled Lisp function FUN. If we have not yet read FUN's -- 2.39.5