summaryrefslogtreecommitdiff
path: root/src/eval.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/eval.c')
-rw-r--r--src/eval.c83
1 files changed, 47 insertions, 36 deletions
diff --git a/src/eval.c b/src/eval.c
index 5f8d266ec7b..a07ab32e76b 100644
--- a/src/eval.c
+++ b/src/eval.c
@@ -749,8 +749,7 @@ usage: (defmacro NAME ARGLIST [DOCSTRING] [DECL] BODY...) */)
DEFUN ("defvaralias", Fdefvaralias, Sdefvaralias, 2, 3, 0,
doc: /* Make NEW-ALIAS a variable alias for symbol BASE-VARIABLE.
-Setting the value of NEW-ALIAS will subsequently set the value of BASE-VARIABLE,
- and getting the value of NEW-ALIAS will return the value BASE-VARIABLE has.
+Aliased variables always have the same value; setting one sets the other.
Third arg DOCSTRING, if non-nil, is documentation for NEW-ALIAS. If it is
omitted or nil, NEW-ALIAS gets the documentation string of BASE-VARIABLE,
or of the variable at the end of the chain of aliases, if BASE-VARIABLE is
@@ -1290,16 +1289,14 @@ Both TAG and VALUE are evalled. */)
{
register struct catchtag *c;
- while (1)
- {
- if (!NILP (tag))
- for (c = catchlist; c; c = c->next)
- {
- if (EQ (c->tag, tag))
- unwind_to_catch (c, value);
- }
- tag = Fsignal (Qno_catch, Fcons (tag, Fcons (value, Qnil)));
- }
+ if (!NILP (tag))
+ for (c = catchlist; c; c = c->next)
+ {
+ if (EQ (c->tag, tag))
+ unwind_to_catch (c, value);
+ }
+ Fsignal (Qno_catch, list2 (tag, value));
+ abort ();
}
@@ -2167,7 +2164,12 @@ DEFUN ("eval", Feval, Seval, 1, 1, 0,
/* At this point, only original_fun and original_args
have values that will be used below */
retry:
- fun = Findirect_function (original_fun, Qnil);
+
+ /* Optimize for no indirection. */
+ fun = original_fun;
+ if (SYMBOLP (fun) && !EQ (fun, Qunbound)
+ && (fun = XSYMBOL (fun)->function, SYMBOLP (fun)))
+ fun = indirect_function (fun);
if (SUBRP (fun))
{
@@ -2183,7 +2185,7 @@ DEFUN ("eval", Feval, Seval, 1, 1, 0,
if (XINT (numargs) < XSUBR (fun)->min_args ||
(XSUBR (fun)->max_args >= 0 && XSUBR (fun)->max_args < XINT (numargs)))
- return Fsignal (Qwrong_number_of_arguments, Fcons (fun, Fcons (numargs, Qnil)));
+ Fsignal (Qwrong_number_of_arguments, list2 (original_fun, numargs));
if (XSUBR (fun)->max_args == UNEVALLED)
{
@@ -2286,11 +2288,13 @@ DEFUN ("eval", Feval, Seval, 1, 1, 0,
val = apply_lambda (fun, original_args, 1);
else
{
+ if (EQ (fun, Qunbound))
+ Fsignal (Qvoid_function, Fcons (original_fun, Qnil));
if (!CONSP (fun))
- return Fsignal (Qinvalid_function, Fcons (fun, Qnil));
+ Fsignal (Qinvalid_function, Fcons (original_fun, Qnil));
funcar = Fcar (fun);
if (!SYMBOLP (funcar))
- return Fsignal (Qinvalid_function, Fcons (fun, Qnil));
+ Fsignal (Qinvalid_function, Fcons (original_fun, Qnil));
if (EQ (funcar, Qautoload))
{
do_autoload (fun, original_fun);
@@ -2301,7 +2305,7 @@ DEFUN ("eval", Feval, Seval, 1, 1, 0,
else if (EQ (funcar, Qlambda))
val = apply_lambda (fun, original_args, 1);
else
- return Fsignal (Qinvalid_function, Fcons (fun, Qnil));
+ Fsignal (Qinvalid_function, Fcons (original_fun, Qnil));
}
done:
CHECK_CONS_LIST ();
@@ -2346,7 +2350,10 @@ usage: (apply FUNCTION &rest ARGUMENTS) */)
numargs += nargs - 2;
- fun = indirect_function (fun);
+ /* Optimize for no indirection. */
+ if (SYMBOLP (fun) && !EQ (fun, Qunbound)
+ && (fun = XSYMBOL (fun)->function, SYMBOLP (fun)))
+ fun = indirect_function (fun);
if (EQ (fun, Qunbound))
{
/* Let funcall get the error */
@@ -2825,7 +2832,7 @@ usage: (funcall FUNCTION &rest ARGUMENTS) */)
int nargs;
Lisp_Object *args;
{
- Lisp_Object fun;
+ Lisp_Object fun, original_fun;
Lisp_Object funcar;
int numargs = nargs - 1;
Lisp_Object lisp_numargs;
@@ -2862,11 +2869,15 @@ usage: (funcall FUNCTION &rest ARGUMENTS) */)
CHECK_CONS_LIST ();
+ original_fun = args[0];
+
retry:
- fun = args[0];
-
- fun = Findirect_function (fun, Qnil);
+ /* Optimize for no indirection. */
+ fun = original_fun;
+ if (SYMBOLP (fun) && !EQ (fun, Qunbound)
+ && (fun = XSYMBOL (fun)->function, SYMBOLP (fun)))
+ fun = indirect_function (fun);
if (SUBRP (fun))
{
@@ -2874,11 +2885,11 @@ usage: (funcall FUNCTION &rest ARGUMENTS) */)
|| (XSUBR (fun)->max_args >= 0 && XSUBR (fun)->max_args < numargs))
{
XSETFASTINT (lisp_numargs, numargs);
- return Fsignal (Qwrong_number_of_arguments, Fcons (fun, Fcons (lisp_numargs, Qnil)));
+ Fsignal (Qwrong_number_of_arguments, list2 (original_fun, lisp_numargs));
}
if (XSUBR (fun)->max_args == UNEVALLED)
- return Fsignal (Qinvalid_function, Fcons (fun, Qnil));
+ Fsignal (Qinvalid_function, Fcons (original_fun, Qnil));
if (XSUBR (fun)->max_args == MANY)
{
@@ -2950,21 +2961,23 @@ usage: (funcall FUNCTION &rest ARGUMENTS) */)
val = funcall_lambda (fun, numargs, args + 1);
else
{
+ if (EQ (fun, Qunbound))
+ Fsignal (Qvoid_function, Fcons (original_fun, Qnil));
if (!CONSP (fun))
- return Fsignal (Qinvalid_function, Fcons (fun, Qnil));
+ Fsignal (Qinvalid_function, Fcons (original_fun, Qnil));
funcar = Fcar (fun);
if (!SYMBOLP (funcar))
- return Fsignal (Qinvalid_function, Fcons (fun, Qnil));
+ Fsignal (Qinvalid_function, Fcons (original_fun, Qnil));
if (EQ (funcar, Qlambda))
val = funcall_lambda (fun, numargs, args + 1);
else if (EQ (funcar, Qautoload))
{
- do_autoload (fun, args[0]);
+ do_autoload (fun, original_fun);
CHECK_CONS_LIST ();
goto retry;
}
else
- return Fsignal (Qinvalid_function, Fcons (fun, Qnil));
+ Fsignal (Qinvalid_function, Fcons (original_fun, Qnil));
}
done:
CHECK_CONS_LIST ();
@@ -3040,7 +3053,7 @@ funcall_lambda (fun, nargs, arg_vector)
if (CONSP (syms_left))
syms_left = XCAR (syms_left);
else
- return Fsignal (Qinvalid_function, Fcons (fun, Qnil));
+ Fsignal (Qinvalid_function, Fcons (fun, Qnil));
}
else if (COMPILEDP (fun))
syms_left = AREF (fun, COMPILED_ARGLIST);
@@ -3053,8 +3066,8 @@ funcall_lambda (fun, nargs, arg_vector)
QUIT;
next = XCAR (syms_left);
- while (!SYMBOLP (next))
- next = Fsignal (Qinvalid_function, Fcons (fun, Qnil));
+ if (!SYMBOLP (next))
+ Fsignal (Qinvalid_function, Fcons (fun, Qnil));
if (EQ (next, Qand_rest))
rest = 1;
@@ -3068,17 +3081,15 @@ funcall_lambda (fun, nargs, arg_vector)
else if (i < nargs)
specbind (next, arg_vector[i++]);
else if (!optional)
- return Fsignal (Qwrong_number_of_arguments,
- Fcons (fun, Fcons (make_number (nargs), Qnil)));
+ Fsignal (Qwrong_number_of_arguments, list2 (fun, make_number (nargs)));
else
specbind (next, Qnil);
}
if (!NILP (syms_left))
- return Fsignal (Qinvalid_function, Fcons (fun, Qnil));
+ Fsignal (Qinvalid_function, Fcons (fun, Qnil));
else if (i < nargs)
- return Fsignal (Qwrong_number_of_arguments,
- Fcons (fun, Fcons (make_number (nargs), Qnil)));
+ Fsignal (Qwrong_number_of_arguments, list2 (fun, make_number (nargs)));
if (CONSP (fun))
val = Fprogn (XCDR (XCDR (fun)));