; * src/eval.c (funcall_subr): Fix last change

This commit is contained in:
Mattias Engdegård 2022-02-01 20:43:15 +01:00
parent e94f08b2d9
commit 4af491605c

View file

@ -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