diff options
| author | Paul Eggert <eggert@cs.ucla.edu> | 2019-01-09 09:52:38 -0800 |
|---|---|---|
| committer | Paul Eggert <eggert@cs.ucla.edu> | 2019-01-09 09:59:10 -0800 |
| commit | a84650334e30b2451bf4a8957bf2d57ade296d4e (patch) | |
| tree | b5642bb98eb89733def116fb6d864f74855023e2 /src/eval.c | |
| parent | f9d0fd6c1953138f7473a22917a1508740b2ce40 (diff) | |
| download | emacs-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.c | 48 |
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 (); |
