summaryrefslogtreecommitdiff
path: root/src/eval.c
diff options
context:
space:
mode:
authorPaul Eggert <eggert@cs.ucla.edu>2019-01-09 09:52:38 -0800
committerPaul Eggert <eggert@cs.ucla.edu>2019-01-09 09:59:10 -0800
commita84650334e30b2451bf4a8957bf2d57ade296d4e (patch)
treeb5642bb98eb89733def116fb6d864f74855023e2 /src/eval.c
parentf9d0fd6c1953138f7473a22917a1508740b2ce40 (diff)
downloademacs-a84650334e30b2451bf4a8957bf2d57ade296d4e.tar.gz
Use shortcuts for Flength
When calculating the length of a Lisp object whose type is known, use a specialized length operation on it to save a bit of runtime overhead. * src/callint.c (Fcall_interactively): * src/minibuf.c (read_minibuf_unwind): Use ASIZE rather than Flength on values that must be vectors. * src/charset.c (Fsort_charsets): * src/coding.c (detect_coding_sjis): (Fdefine_coding_system_internal): * src/data.c (wrong_choice): * src/eval.c (Flet, eval_sub, Fapply, apply_lambda): * src/fns.c (sort_list): * src/font.c (font_vconcat_entity_vectors) (font_find_for_lface): * src/frame.c (Fmodify_frame_parameters): * src/fringe.c (get_logical_fringe_bitmap): * src/ftfont.c (ftfont_get_open_type_spec): * src/gtkutil.c (xg_print_frames_dialog): * src/lread.c (read1, read_vector): * src/keymap.c (Fkey_description): * src/kqueue.c (Fkqueue_add_watch): * src/macfont.m (macfont_get_open_type_spec): * src/menu.c (parse_single_submenu, x_popup_menu_1): * src/minibuf.c (Finternal_complete_buffer): * src/nsfont.m (ns_findfonts, nsfont_list_family): * src/process.c (Fmake_process): * src/search.c (Fset_match_data): * src/xfaces.c (Fx_family_fonts): Use list_length rather than Flength on values that must be lists. * src/fns.c (list_length): New function. (Flength): Use it. * src/nsfont.m (ns_findfonts): Use !NILP (x) rather than XFIXNUM (Flength (x)) != 0. * src/xdisp.c (store_mode_line_string): Use SCHARS rather than Flength on values that must be strings.
Diffstat (limited to 'src/eval.c')
-rw-r--r--src/eval.c48
1 files changed, 21 insertions, 27 deletions
diff --git a/src/eval.c b/src/eval.c
index c64a40b955d..28478956e35 100644
--- a/src/eval.c
+++ b/src/eval.c
@@ -951,16 +951,15 @@ usage: (let VARLIST BODY...) */)
(Lisp_Object args)
{
Lisp_Object *temps, tem, lexenv;
- Lisp_Object elt, varlist;
+ Lisp_Object elt;
ptrdiff_t count = SPECPDL_INDEX ();
ptrdiff_t argnum;
USE_SAFE_ALLOCA;
- varlist = XCAR (args);
- CHECK_LIST (varlist);
+ Lisp_Object varlist = XCAR (args);
/* Make space to hold the values to give the bound variables. */
- EMACS_INT varlist_len = XFIXNAT (Flength (varlist));
+ EMACS_INT varlist_len = list_length (varlist);
SAFE_ALLOCA_LISP (temps, varlist_len);
ptrdiff_t nvars = varlist_len;
@@ -2263,14 +2262,15 @@ eval_sub (Lisp_Object form)
if (SUBRP (fun))
{
Lisp_Object args_left = original_args;
- Lisp_Object numargs = Flength (args_left);
+ ptrdiff_t numargs = list_length (args_left);
check_cons_list ();
- if (XFIXNUM (numargs) < XSUBR (fun)->min_args
+ if (numargs < XSUBR (fun)->min_args
|| (XSUBR (fun)->max_args >= 0
- && XSUBR (fun)->max_args < XFIXNUM (numargs)))
- xsignal2 (Qwrong_number_of_arguments, original_fun, numargs);
+ && XSUBR (fun)->max_args < numargs))
+ xsignal2 (Qwrong_number_of_arguments, original_fun,
+ make_fixnum (numargs));
else if (XSUBR (fun)->max_args == UNEVALLED)
val = (XSUBR (fun)->function.aUNEVALLED) (args_left);
@@ -2281,9 +2281,9 @@ eval_sub (Lisp_Object form)
ptrdiff_t argnum = 0;
USE_SAFE_ALLOCA;
- SAFE_ALLOCA_LISP (vals, XFIXNUM (numargs));
+ SAFE_ALLOCA_LISP (vals, numargs);
- while (CONSP (args_left) && argnum < XFIXNUM (numargs))
+ while (CONSP (args_left) && argnum < numargs)
{
Lisp_Object arg = XCAR (args_left);
args_left = XCDR (args_left);
@@ -2313,7 +2313,7 @@ eval_sub (Lisp_Object form)
args_left = Fcdr (args_left);
}
- set_backtrace_args (specpdl + count, argvals, XFIXNUM (numargs));
+ set_backtrace_args (specpdl + count, argvals, numargs);
switch (i)
{
@@ -2417,16 +2417,13 @@ Thus, (apply \\='+ 1 2 \\='(3 4)) returns 10.
usage: (apply FUNCTION &rest ARGUMENTS) */)
(ptrdiff_t nargs, Lisp_Object *args)
{
- ptrdiff_t i, numargs, funcall_nargs;
- register Lisp_Object *funcall_args = NULL;
- register Lisp_Object spread_arg = args[nargs - 1];
+ ptrdiff_t i, funcall_nargs;
+ Lisp_Object *funcall_args = NULL;
+ Lisp_Object spread_arg = args[nargs - 1];
Lisp_Object fun = args[0];
- Lisp_Object retval;
USE_SAFE_ALLOCA;
- CHECK_LIST (spread_arg);
-
- numargs = XFIXNUM (Flength (spread_arg));
+ ptrdiff_t numargs = list_length (spread_arg);
if (numargs == 0)
return Ffuncall (nargs - 1, args);
@@ -2476,7 +2473,7 @@ usage: (apply FUNCTION &rest ARGUMENTS) */)
spread_arg = XCDR (spread_arg);
}
- retval = Ffuncall (funcall_nargs, funcall_args);
+ Lisp_Object retval = Ffuncall (funcall_nargs, funcall_args);
SAFE_FREE ();
return retval;
@@ -2974,25 +2971,22 @@ funcall_subr (struct Lisp_Subr *subr, ptrdiff_t numargs, Lisp_Object *args)
static Lisp_Object
apply_lambda (Lisp_Object fun, Lisp_Object args, ptrdiff_t count)
{
- Lisp_Object args_left;
- ptrdiff_t i;
- EMACS_INT numargs;
Lisp_Object *arg_vector;
Lisp_Object tem;
USE_SAFE_ALLOCA;
- numargs = XFIXNAT (Flength (args));
+ ptrdiff_t numargs = list_length (args);
SAFE_ALLOCA_LISP (arg_vector, numargs);
- args_left = args;
+ Lisp_Object args_left = args;
- for (i = 0; i < numargs; )
+ for (ptrdiff_t i = 0; i < numargs; i++)
{
tem = Fcar (args_left), args_left = Fcdr (args_left);
tem = eval_sub (tem);
- arg_vector[i++] = tem;
+ arg_vector[i] = tem;
}
- set_backtrace_args (specpdl + count, arg_vector, i);
+ set_backtrace_args (specpdl + count, arg_vector, numargs);
tem = funcall_lambda (fun, numargs, arg_vector);
check_cons_list ();