Commit becfa255 authored by Paul Eggert's avatar Paul Eggert
Browse files

* callint.c (Fcall_interactively): <, not <=, for optimization.

(Fcall_interactively): Count the number of arguments produced,
not the number of arguments given.  This is simpler and lets GCC
4.6.0 generate slightly better code.
parent dae0cd48
2011-04-09 Paul Eggert <eggert@cs.ucla.edu>
* callint.c (Fcall_interactively): <, not <=, for optimization.
(Fcall_interactively): Count the number of arguments produced,
not the number of arguments given. This is simpler and lets GCC
4.6.0 generate slightly better code.
* ftfont.c: Distingish more carefully between FcChar8 and char.
The previous code passed unsigned char * to a functions like
strlen and xstrcasecmp that expect char *, which does not
......
......@@ -269,8 +269,8 @@ invoke it. If KEYS is omitted or nil, the return value of
recorded as a call to the function named callint_argfuns[varies[i]]. */
int *varies;
register size_t i, j;
size_t count;
register size_t i;
size_t nargs;
int foo;
char prompt1[100];
char *tem1;
......@@ -445,30 +445,29 @@ invoke it. If KEYS is omitted or nil, the return value of
else break;
}
/* Count the number of arguments the interactive spec would have
us give to the function. */
/* Count the number of arguments, which is one plus the number of arguments
the interactive spec would have us give to the function. */
tem = string;
for (j = 0; *tem;)
for (nargs = 1; *tem; )
{
/* 'r' specifications ("point and mark as 2 numeric args")
produce *two* arguments. */
if (*tem == 'r')
j += 2;
nargs += 2;
else
j++;
nargs++;
tem = strchr (tem, '\n');
if (tem)
++tem;
else
break;
}
count = j;
args = (Lisp_Object *) alloca ((count + 1) * sizeof (Lisp_Object));
visargs = (Lisp_Object *) alloca ((count + 1) * sizeof (Lisp_Object));
varies = (int *) alloca ((count + 1) * sizeof (int));
args = (Lisp_Object *) alloca (nargs * sizeof (Lisp_Object));
visargs = (Lisp_Object *) alloca (nargs * sizeof (Lisp_Object));
varies = (int *) alloca (nargs * sizeof (int));
for (i = 0; i < (count + 1); i++)
for (i = 0; i < nargs; i++)
{
args[i] = Qnil;
visargs[i] = Qnil;
......@@ -476,8 +475,8 @@ invoke it. If KEYS is omitted or nil, the return value of
}
GCPRO5 (prefix_arg, function, *args, *visargs, up_event);
gcpro3.nvars = (count + 1);
gcpro4.nvars = (count + 1);
gcpro3.nvars = nargs;
gcpro4.nvars = nargs;
if (!NILP (enable))
specbind (Qenable_recursive_minibuffers, Qt);
......@@ -809,14 +808,14 @@ invoke it. If KEYS is omitted or nil, the return value of
if (arg_from_tty || !NILP (record_flag))
{
visargs[0] = function;
for (i = 1; i < count + 1; i++)
for (i = 1; i < nargs; i++)
{
if (varies[i] > 0)
visargs[i] = Fcons (intern (callint_argfuns[varies[i]]), Qnil);
else
visargs[i] = quotify_arg (args[i]);
}
Vcommand_history = Fcons (Flist (count + 1, visargs),
Vcommand_history = Fcons (Flist (nargs, visargs),
Vcommand_history);
/* Don't keep command history around forever. */
if (INTEGERP (Vhistory_length) && XINT (Vhistory_length) > 0)
......@@ -829,7 +828,7 @@ invoke it. If KEYS is omitted or nil, the return value of
/* If we used a marker to hold point, mark, or an end of the region,
temporarily, convert it to an integer now. */
for (i = 1; i <= count; i++)
for (i = 1; i < nargs; i++)
if (varies[i] >= 1 && varies[i] <= 4)
XSETINT (args[i], marker_position (args[i]));
......@@ -846,7 +845,7 @@ invoke it. If KEYS is omitted or nil, the return value of
specbind (Qcommand_debug_status, Qnil);
temporarily_switch_to_single_kboard (NULL);
val = Ffuncall (count + 1, args);
val = Ffuncall (nargs, args);
UNGCPRO;
return unbind_to (speccount, val);
}
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment