aboutsummaryrefslogtreecommitdiffstats
path: root/src/eval.c
diff options
context:
space:
mode:
authorPaul Eggert2019-01-09 09:52:38 -0800
committerPaul Eggert2019-01-09 09:59:10 -0800
commita84650334e30b2451bf4a8957bf2d57ade296d4e (patch)
treeb5642bb98eb89733def116fb6d864f74855023e2 /src/eval.c
parentf9d0fd6c1953138f7473a22917a1508740b2ce40 (diff)
downloademacs-a84650334e30b2451bf4a8957bf2d57ade296d4e.tar.gz
emacs-a84650334e30b2451bf4a8957bf2d57ade296d4e.zip
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...) */)
951 (Lisp_Object args) 951 (Lisp_Object args)
952{ 952{
953 Lisp_Object *temps, tem, lexenv; 953 Lisp_Object *temps, tem, lexenv;
954 Lisp_Object elt, varlist; 954 Lisp_Object elt;
955 ptrdiff_t count = SPECPDL_INDEX (); 955 ptrdiff_t count = SPECPDL_INDEX ();
956 ptrdiff_t argnum; 956 ptrdiff_t argnum;
957 USE_SAFE_ALLOCA; 957 USE_SAFE_ALLOCA;
958 958
959 varlist = XCAR (args); 959 Lisp_Object varlist = XCAR (args);
960 CHECK_LIST (varlist);
961 960
962 /* Make space to hold the values to give the bound variables. */ 961 /* Make space to hold the values to give the bound variables. */
963 EMACS_INT varlist_len = XFIXNAT (Flength (varlist)); 962 EMACS_INT varlist_len = list_length (varlist);
964 SAFE_ALLOCA_LISP (temps, varlist_len); 963 SAFE_ALLOCA_LISP (temps, varlist_len);
965 ptrdiff_t nvars = varlist_len; 964 ptrdiff_t nvars = varlist_len;
966 965
@@ -2263,14 +2262,15 @@ eval_sub (Lisp_Object form)
2263 if (SUBRP (fun)) 2262 if (SUBRP (fun))
2264 { 2263 {
2265 Lisp_Object args_left = original_args; 2264 Lisp_Object args_left = original_args;
2266 Lisp_Object numargs = Flength (args_left); 2265 ptrdiff_t numargs = list_length (args_left);
2267 2266
2268 check_cons_list (); 2267 check_cons_list ();
2269 2268
2270 if (XFIXNUM (numargs) < XSUBR (fun)->min_args 2269 if (numargs < XSUBR (fun)->min_args
2271 || (XSUBR (fun)->max_args >= 0 2270 || (XSUBR (fun)->max_args >= 0
2272 && XSUBR (fun)->max_args < XFIXNUM (numargs))) 2271 && XSUBR (fun)->max_args < numargs))
2273 xsignal2 (Qwrong_number_of_arguments, original_fun, numargs); 2272 xsignal2 (Qwrong_number_of_arguments, original_fun,
2273 make_fixnum (numargs));
2274 2274
2275 else if (XSUBR (fun)->max_args == UNEVALLED) 2275 else if (XSUBR (fun)->max_args == UNEVALLED)
2276 val = (XSUBR (fun)->function.aUNEVALLED) (args_left); 2276 val = (XSUBR (fun)->function.aUNEVALLED) (args_left);
@@ -2281,9 +2281,9 @@ eval_sub (Lisp_Object form)
2281 ptrdiff_t argnum = 0; 2281 ptrdiff_t argnum = 0;
2282 USE_SAFE_ALLOCA; 2282 USE_SAFE_ALLOCA;
2283 2283
2284 SAFE_ALLOCA_LISP (vals, XFIXNUM (numargs)); 2284 SAFE_ALLOCA_LISP (vals, numargs);
2285 2285
2286 while (CONSP (args_left) && argnum < XFIXNUM (numargs)) 2286 while (CONSP (args_left) && argnum < numargs)
2287 { 2287 {
2288 Lisp_Object arg = XCAR (args_left); 2288 Lisp_Object arg = XCAR (args_left);
2289 args_left = XCDR (args_left); 2289 args_left = XCDR (args_left);
@@ -2313,7 +2313,7 @@ eval_sub (Lisp_Object form)
2313 args_left = Fcdr (args_left); 2313 args_left = Fcdr (args_left);
2314 } 2314 }
2315 2315
2316 set_backtrace_args (specpdl + count, argvals, XFIXNUM (numargs)); 2316 set_backtrace_args (specpdl + count, argvals, numargs);
2317 2317
2318 switch (i) 2318 switch (i)
2319 { 2319 {
@@ -2417,16 +2417,13 @@ Thus, (apply \\='+ 1 2 \\='(3 4)) returns 10.
2417usage: (apply FUNCTION &rest ARGUMENTS) */) 2417usage: (apply FUNCTION &rest ARGUMENTS) */)
2418 (ptrdiff_t nargs, Lisp_Object *args) 2418 (ptrdiff_t nargs, Lisp_Object *args)
2419{ 2419{
2420 ptrdiff_t i, numargs, funcall_nargs; 2420 ptrdiff_t i, funcall_nargs;
2421 register Lisp_Object *funcall_args = NULL; 2421 Lisp_Object *funcall_args = NULL;
2422 register Lisp_Object spread_arg = args[nargs - 1]; 2422 Lisp_Object spread_arg = args[nargs - 1];
2423 Lisp_Object fun = args[0]; 2423 Lisp_Object fun = args[0];
2424 Lisp_Object retval;
2425 USE_SAFE_ALLOCA; 2424 USE_SAFE_ALLOCA;
2426 2425
2427 CHECK_LIST (spread_arg); 2426 ptrdiff_t numargs = list_length (spread_arg);
2428
2429 numargs = XFIXNUM (Flength (spread_arg));
2430 2427
2431 if (numargs == 0) 2428 if (numargs == 0)
2432 return Ffuncall (nargs - 1, args); 2429 return Ffuncall (nargs - 1, args);
@@ -2476,7 +2473,7 @@ usage: (apply FUNCTION &rest ARGUMENTS) */)
2476 spread_arg = XCDR (spread_arg); 2473 spread_arg = XCDR (spread_arg);
2477 } 2474 }
2478 2475
2479 retval = Ffuncall (funcall_nargs, funcall_args); 2476 Lisp_Object retval = Ffuncall (funcall_nargs, funcall_args);
2480 2477
2481 SAFE_FREE (); 2478 SAFE_FREE ();
2482 return retval; 2479 return retval;
@@ -2974,25 +2971,22 @@ funcall_subr (struct Lisp_Subr *subr, ptrdiff_t numargs, Lisp_Object *args)
2974static Lisp_Object 2971static Lisp_Object
2975apply_lambda (Lisp_Object fun, Lisp_Object args, ptrdiff_t count) 2972apply_lambda (Lisp_Object fun, Lisp_Object args, ptrdiff_t count)
2976{ 2973{
2977 Lisp_Object args_left;
2978 ptrdiff_t i;
2979 EMACS_INT numargs;
2980 Lisp_Object *arg_vector; 2974 Lisp_Object *arg_vector;
2981 Lisp_Object tem; 2975 Lisp_Object tem;
2982 USE_SAFE_ALLOCA; 2976 USE_SAFE_ALLOCA;
2983 2977
2984 numargs = XFIXNAT (Flength (args)); 2978 ptrdiff_t numargs = list_length (args);
2985 SAFE_ALLOCA_LISP (arg_vector, numargs); 2979 SAFE_ALLOCA_LISP (arg_vector, numargs);
2986 args_left = args; 2980 Lisp_Object args_left = args;
2987 2981
2988 for (i = 0; i < numargs; ) 2982 for (ptrdiff_t i = 0; i < numargs; i++)
2989 { 2983 {
2990 tem = Fcar (args_left), args_left = Fcdr (args_left); 2984 tem = Fcar (args_left), args_left = Fcdr (args_left);
2991 tem = eval_sub (tem); 2985 tem = eval_sub (tem);
2992 arg_vector[i++] = tem; 2986 arg_vector[i] = tem;
2993 } 2987 }
2994 2988
2995 set_backtrace_args (specpdl + count, arg_vector, i); 2989 set_backtrace_args (specpdl + count, arg_vector, numargs);
2996 tem = funcall_lambda (fun, numargs, arg_vector); 2990 tem = funcall_lambda (fun, numargs, arg_vector);
2997 2991
2998 check_cons_list (); 2992 check_cons_list ();