diff options
| author | Paul Eggert | 2019-01-09 09:52:38 -0800 |
|---|---|---|
| committer | Paul Eggert | 2019-01-09 09:59:10 -0800 |
| commit | a84650334e30b2451bf4a8957bf2d57ade296d4e (patch) | |
| tree | b5642bb98eb89733def116fb6d864f74855023e2 /src/eval.c | |
| parent | f9d0fd6c1953138f7473a22917a1508740b2ce40 (diff) | |
| download | emacs-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.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...) */) | |||
| 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. | |||
| 2417 | usage: (apply FUNCTION &rest ARGUMENTS) */) | 2417 | usage: (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) | |||
| 2974 | static Lisp_Object | 2971 | static Lisp_Object |
| 2975 | apply_lambda (Lisp_Object fun, Lisp_Object args, ptrdiff_t count) | 2972 | apply_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 (); |