From 0fde935b66e43e4d7ec137ba6195de993168587a Mon Sep 17 00:00:00 2001 From: Stefan Monnier Date: Sat, 23 Dec 2023 00:25:46 -0500 Subject: [PATCH] Split safe_call between redisplay and non-redisplay versions The `safe_call/eval` family of functions started its life in `xdisp.c` for the needs of redisplay but quickly became popular outside of it. This is not ideal because despite their name, they are somewhat specific to the needs of redisplay. So we split them into `safe_call/eval` (in `eval.c`) and `dsafe_call/eval` (in `xdisp.c`). We took this opportunity to slightly change their calling convention to be friendly to the CALLN-style macros. While at it, we introduce a new `calln` macro as well which does all that `call[1-8]` used to do. * src/eval.c (safe_eval_handler, safe_funcall, safe_eval): New functions, Copied from `xdisp.c`. Don't obey `inhibit_eval_during_redisplay` any more. Adjust error message to not claim it happened during redisplay. * src/lisp.h (calln): New macro. (call1, call2, call3, call4, call5, call6, call7, call8): Turn them into aliases of `calln`. (safe_funcall): Declare. (safe_calln): New macro. (safe_call1, safe_call2): Redefine as compatibility macros. (safe_call, safe_call1, safe_call2): Delete. Replace all callers with calls to `safe_calln`. * src/xdisp.c (dsafe_eval_handler): Rename from `safe_eval_handler`. Adjust all users. (dsafe__call): Rename from `safe_call` and change calling convention to work with something like CALLMANY. Adjust all users. (safe_call, safe__call1, safe_call2): Delete functions. (SAFE_CALLMANY, dsafe_calln): New macros. (dsafe_call1, dsafe_eval): Rename from `safe_call1` and `safe_eval`, and rewrite using them. Adjust all users. (clear_message, prepare_menu_bars, redisplay_window): Use `dsafe_calln`. (run_window_scroll_functions): Don't let-bind `Qinhibit_quit` since `safe_run_hooks_2` does it for us. --- src/buffer.c | 4 +- src/coding.c | 4 +- src/composite.c | 2 +- src/eval.c | 29 ++++++++++++ src/frame.c | 4 +- src/haikuselect.c | 2 +- src/keyboard.c | 4 +- src/keymap.c | 2 +- src/lisp.h | 85 +++++++--------------------------- src/print.c | 2 +- src/syntax.c | 2 +- src/term.c | 2 +- src/terminal.c | 2 +- src/treesit.c | 2 +- src/window.c | 2 +- src/xdisp.c | 115 ++++++++++++++-------------------------------- src/xfaces.c | 2 +- src/xterm.c | 6 +-- 18 files changed, 102 insertions(+), 169 deletions(-) diff --git a/src/buffer.c b/src/buffer.c index a7299f4a49e..ea0c23192b7 100644 --- a/src/buffer.c +++ b/src/buffer.c @@ -1739,7 +1739,7 @@ exists, return the buffer `*scratch*' (creating it if necessary). */) if (!NILP (notsogood)) return notsogood; else - return safe_call (1, Qget_scratch_buffer_create); + return safe_calln (Qget_scratch_buffer_create); } /* The following function is a safe variant of Fother_buffer: It doesn't @@ -1760,7 +1760,7 @@ other_buffer_safely (Lisp_Object buffer) becoming dead under our feet. safe_call below could return nil if recreating *scratch* in Lisp, which does some fancy stuff, signals an error in some weird use case. */ - buf = safe_call (1, Qget_scratch_buffer_create); + buf = safe_calln (Qget_scratch_buffer_create); if (NILP (buf)) { AUTO_STRING (scratch, "*scratch*"); diff --git a/src/coding.c b/src/coding.c index b7f4120dc8d..17f982ab2dd 100644 --- a/src/coding.c +++ b/src/coding.c @@ -8170,7 +8170,7 @@ decode_coding_object (struct coding_system *coding, Fcons (undo_list, Fcurrent_buffer ())); bset_undo_list (current_buffer, Qt); TEMP_SET_PT_BOTH (coding->dst_pos, coding->dst_pos_byte); - val = safe_call1 (CODING_ATTR_POST_READ (attrs), + val = safe_calln (CODING_ATTR_POST_READ (attrs), make_fixnum (coding->produced_char)); CHECK_FIXNAT (val); coding->produced_char += Z - prev_Z; @@ -8336,7 +8336,7 @@ encode_coding_object (struct coding_system *coding, set_buffer_internal (XBUFFER (coding->src_object)); } - safe_call2 (CODING_ATTR_PRE_WRITE (attrs), + safe_calln (CODING_ATTR_PRE_WRITE (attrs), make_fixnum (BEG), make_fixnum (Z)); if (XBUFFER (coding->src_object) != current_buffer) kill_src_buffer = 1; diff --git a/src/composite.c b/src/composite.c index 9332c1cb9a3..aeae02fd1ce 100644 --- a/src/composite.c +++ b/src/composite.c @@ -987,7 +987,7 @@ autocmp_chars (Lisp_Object rule, ptrdiff_t charpos, ptrdiff_t bytepos, if (NILP (string)) record_unwind_protect (restore_point_unwind, build_marker (current_buffer, pt, pt_byte)); - lgstring = safe_call (7, Vauto_composition_function, AREF (rule, 2), + lgstring = safe_calln (Vauto_composition_function, AREF (rule, 2), pos, make_fixnum (to), font_object, string, direction); } diff --git a/src/eval.c b/src/eval.c index b3d3fc3132b..30edaccdb62 100644 --- a/src/eval.c +++ b/src/eval.c @@ -3023,6 +3023,35 @@ usage: (funcall FUNCTION &rest ARGUMENTS) */) } +static Lisp_Object +safe_eval_handler (Lisp_Object arg, ptrdiff_t nargs, Lisp_Object *args) +{ + add_to_log ("Error muted by safe_call: %S signaled %S", + Flist (nargs, args), arg); + return Qnil; +} + +Lisp_Object +safe_funcall (ptrdiff_t nargs, Lisp_Object *args) +{ + specpdl_ref count = SPECPDL_INDEX (); + /* FIXME: This function started its life in 'xdisp.c' for use internally + by the redisplay. So it was important to inhibit redisplay. + Not clear if we still need this 'specbind' now that 'xdisp.c' has its + own version of this code. */ + specbind (Qinhibit_redisplay, Qt); + /* Use Qt to ensure debugger does not run. */ + Lisp_Object val = internal_condition_case_n (Ffuncall, nargs, args, Qt, + safe_eval_handler); + return unbind_to (count, val); +} + +Lisp_Object +safe_eval (Lisp_Object sexp) +{ + return safe_calln (Qeval, sexp, Qt); +} + /* Apply a C subroutine SUBR to the NUMARGS evaluated arguments in ARG_VECTOR and return the result of evaluation. */ diff --git a/src/frame.c b/src/frame.c index 38ac316ce87..b6f92d6f9f5 100644 --- a/src/frame.c +++ b/src/frame.c @@ -2149,7 +2149,7 @@ delete_frame (Lisp_Object frame, Lisp_Object force) x_clipboard_manager_save_frame (frame); #endif - safe_call2 (Qrun_hook_with_args, Qdelete_frame_functions, frame); + safe_calln (Qrun_hook_with_args, Qdelete_frame_functions, frame); } /* delete_frame_functions may have deleted any frame, including this @@ -2461,7 +2461,7 @@ delete_frame (Lisp_Object frame, Lisp_Object force) = Fcons (list3 (Qrun_hook_with_args, Qafter_delete_frame_functions, frame), pending_funcalls); else - safe_call2 (Qrun_hook_with_args, Qafter_delete_frame_functions, frame); + safe_calln (Qrun_hook_with_args, Qafter_delete_frame_functions, frame); if (!NILP (minibuffer_child_frame)) /* If minibuffer_child_frame is non-nil, it was FRAME's minibuffer diff --git a/src/haikuselect.c b/src/haikuselect.c index 608b8e8fe30..567ebd0b302 100644 --- a/src/haikuselect.c +++ b/src/haikuselect.c @@ -1189,7 +1189,7 @@ haiku_note_drag_wheel (struct input_event *ie) if (!NILP (Vhaiku_drag_wheel_function) && (haiku_dnd_allow_same_frame || XFRAME (ie->frame_or_window) != haiku_dnd_frame)) - safe_call (7, Vhaiku_drag_wheel_function, ie->frame_or_window, + safe_calln (Vhaiku_drag_wheel_function, ie->frame_or_window, ie->x, ie->y, horizontal ? Qt : Qnil, up ? Qt : Qnil, make_int (ie->modifiers)); diff --git a/src/keyboard.c b/src/keyboard.c index 81605e75ba2..39abe07e5dc 100644 --- a/src/keyboard.c +++ b/src/keyboard.c @@ -2226,7 +2226,7 @@ show_help_echo (Lisp_Object help, Lisp_Object window, Lisp_Object object, if (!NILP (help) && !STRINGP (help)) { if (FUNCTIONP (help)) - help = safe_call (4, help, window, object, pos); + help = safe_calln (help, window, object, pos); else help = safe_eval (help); @@ -4654,7 +4654,7 @@ timer_check_2 (Lisp_Object timers, Lisp_Object idle_timers) { Lisp_Object funcall = XCAR (pending_funcalls); pending_funcalls = XCDR (pending_funcalls); - safe_call2 (Qapply, XCAR (funcall), XCDR (funcall)); + safe_calln (Qapply, XCAR (funcall), XCDR (funcall)); } if (CONSP (timers) || CONSP (idle_timers)) diff --git a/src/keymap.c b/src/keymap.c index d710bae02e0..b1d12227113 100644 --- a/src/keymap.c +++ b/src/keymap.c @@ -610,7 +610,7 @@ map_keymap_canonical (Lisp_Object map, map_keymap_function_t fun, Lisp_Object ar { /* map_keymap_canonical may be used from redisplay (e.g. when building menus) so be careful to ignore errors and to inhibit redisplay. */ - map = safe_call1 (Qkeymap_canonicalize, map); + map = safe_calln (Qkeymap_canonicalize, map); /* No need to use `map_keymap' here because canonical map has no parent. */ map_keymap_internal (map, fun, args, data); } diff --git a/src/lisp.h b/src/lisp.h index df6cf1df544..ed1b007d4c5 100644 --- a/src/lisp.h +++ b/src/lisp.h @@ -3233,77 +3233,25 @@ enum maxargs empty initializers), and is overkill for simple usages like 'Finsert (1, &text);'. */ #define CALLN(f, ...) CALLMANY (f, ((Lisp_Object []) {__VA_ARGS__})) - -/* Call function fn on no arguments. */ +#define calln(...) CALLN (Ffuncall, __VA_ARGS__) +/* Compatibility aliases. */ +#define call1 calln +#define call2 calln +#define call3 calln +#define call4 calln +#define call5 calln +#define call6 calln +#define call7 calln +#define call8 calln + +/* Define 'call0' as a function rather than a CPP macro because we + sometimes want to pass it as a first class function. */ INLINE Lisp_Object call0 (Lisp_Object fn) { return Ffuncall (1, &fn); } -/* Call function fn with 1 argument arg1. */ -INLINE Lisp_Object -call1 (Lisp_Object fn, Lisp_Object arg1) -{ - return CALLN (Ffuncall, fn, arg1); -} - -/* Call function fn with 2 arguments arg1, arg2. */ -INLINE Lisp_Object -call2 (Lisp_Object fn, Lisp_Object arg1, Lisp_Object arg2) -{ - return CALLN (Ffuncall, fn, arg1, arg2); -} - -/* Call function fn with 3 arguments arg1, arg2, arg3. */ -INLINE Lisp_Object -call3 (Lisp_Object fn, Lisp_Object arg1, Lisp_Object arg2, Lisp_Object arg3) -{ - return CALLN (Ffuncall, fn, arg1, arg2, arg3); -} - -/* Call function fn with 4 arguments arg1, arg2, arg3, arg4. */ -INLINE Lisp_Object -call4 (Lisp_Object fn, Lisp_Object arg1, Lisp_Object arg2, Lisp_Object arg3, - Lisp_Object arg4) -{ - return CALLN (Ffuncall, fn, arg1, arg2, arg3, arg4); -} - -/* Call function fn with 5 arguments arg1, arg2, arg3, arg4, arg5. */ -INLINE Lisp_Object -call5 (Lisp_Object fn, Lisp_Object arg1, Lisp_Object arg2, Lisp_Object arg3, - Lisp_Object arg4, Lisp_Object arg5) -{ - return CALLN (Ffuncall, fn, arg1, arg2, arg3, arg4, arg5); -} - -/* Call function fn with 6 arguments arg1, arg2, arg3, arg4, arg5, arg6. */ -INLINE Lisp_Object -call6 (Lisp_Object fn, Lisp_Object arg1, Lisp_Object arg2, Lisp_Object arg3, - Lisp_Object arg4, Lisp_Object arg5, Lisp_Object arg6) -{ - return CALLN (Ffuncall, fn, arg1, arg2, arg3, arg4, arg5, arg6); -} - -/* Call function fn with 7 arguments arg1, arg2, arg3, arg4, arg5, arg6, arg7. */ -INLINE Lisp_Object -call7 (Lisp_Object fn, Lisp_Object arg1, Lisp_Object arg2, Lisp_Object arg3, - Lisp_Object arg4, Lisp_Object arg5, Lisp_Object arg6, Lisp_Object arg7) -{ - return CALLN (Ffuncall, fn, arg1, arg2, arg3, arg4, arg5, arg6, arg7); -} - -/* Call function fn with 8 arguments arg1, arg2, arg3, arg4, arg5, - arg6, arg7, arg8. */ -INLINE Lisp_Object -call8 (Lisp_Object fn, Lisp_Object arg1, Lisp_Object arg2, Lisp_Object arg3, - Lisp_Object arg4, Lisp_Object arg5, Lisp_Object arg6, Lisp_Object arg7, - Lisp_Object arg8) -{ - return CALLN (Ffuncall, fn, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8); -} - extern void defvar_lisp (struct Lisp_Objfwd const *, char const *); extern void defvar_lisp_nopro (struct Lisp_Objfwd const *, char const *); extern void defvar_bool (struct Lisp_Boolfwd const *, char const *); @@ -4618,9 +4566,10 @@ extern Lisp_Object load_with_autoload_queue Lisp_Object nosuffix, Lisp_Object must_suffix); extern Lisp_Object call_debugger (Lisp_Object arg); extern void init_eval_once (void); -extern Lisp_Object safe_call (ptrdiff_t, Lisp_Object, ...); -extern Lisp_Object safe_call1 (Lisp_Object, Lisp_Object); -extern Lisp_Object safe_call2 (Lisp_Object, Lisp_Object, Lisp_Object); +extern Lisp_Object safe_funcall (ptrdiff_t, Lisp_Object*); +#define safe_calln(...) \ + CALLMANY (safe_funcall, ((Lisp_Object []) {__VA_ARGS__})) + extern void init_eval (void); extern void syms_of_eval (void); extern void prog_ignore (Lisp_Object); diff --git a/src/print.c b/src/print.c index 09e00329676..96c4d0a5d1e 100644 --- a/src/print.c +++ b/src/print.c @@ -1094,7 +1094,7 @@ print_error_message (Lisp_Object data, Lisp_Object stream, const char *context, /* `substitute-command-keys' may bug out, which would lead to infinite recursion when we're called from skip_debugger, so ignore errors. */ - Lisp_Object subs = safe_call1 (Qsubstitute_command_keys, errmsg); + Lisp_Object subs = safe_calln (Qsubstitute_command_keys, errmsg); if (!NILP (subs)) errmsg = subs; } diff --git a/src/syntax.c b/src/syntax.c index 0cac923bba7..391c7f9bc3e 100644 --- a/src/syntax.c +++ b/src/syntax.c @@ -468,7 +468,7 @@ parse_sexp_propertize (ptrdiff_t charpos) && syntax_propertize__done < zv) { modiff_count modiffs = CHARS_MODIFF; - safe_call1 (Qinternal__syntax_propertize, + safe_calln (Qinternal__syntax_propertize, make_fixnum (min (zv, 1 + charpos))); if (modiffs != CHARS_MODIFF) error ("internal--syntax-propertize modified the buffer!"); diff --git a/src/term.c b/src/term.c index 25184101b78..5b50f169493 100644 --- a/src/term.c +++ b/src/term.c @@ -2235,7 +2235,7 @@ set_tty_color_mode (struct tty_display_info *tty, struct frame *f) tty->previous_color_mode = mode; tty_setup_colors (tty , mode); /* This recomputes all the faces given the new color definitions. */ - safe_call (1, intern ("tty-set-up-initial-frame-faces")); + safe_calln (intern ("tty-set-up-initial-frame-faces")); } } diff --git a/src/terminal.c b/src/terminal.c index 07c37883f0e..9ccc27c6bc6 100644 --- a/src/terminal.c +++ b/src/terminal.c @@ -389,7 +389,7 @@ but if the second argument FORCE is non-nil, you may do so. */) Qdelete_terminal_functions, terminal), pending_funcalls); else - safe_call2 (Qrun_hook_with_args, Qdelete_terminal_functions, terminal); + safe_calln (Qrun_hook_with_args, Qdelete_terminal_functions, terminal); if (t->delete_terminal_hook) (*t->delete_terminal_hook) (t); diff --git a/src/treesit.c b/src/treesit.c index c85038e70cf..bbd0a405c29 100644 --- a/src/treesit.c +++ b/src/treesit.c @@ -1040,7 +1040,7 @@ treesit_call_after_change_functions (TSTree *old_tree, TSTree *new_tree, for each of them. */ Lisp_Object functions = XTS_PARSER (parser)->after_change_functions; FOR_EACH_TAIL (functions) - safe_call2 (XCAR (functions), lisp_ranges, parser); + safe_calln (XCAR (functions), lisp_ranges, parser); unbind_to (count, Qnil); } diff --git a/src/window.c b/src/window.c index 3d18d48bfb7..d6b2dd1d959 100644 --- a/src/window.c +++ b/src/window.c @@ -3829,7 +3829,7 @@ run_window_change_functions_1 (Lisp_Object symbol, Lisp_Object buffer, frame. Make sure to record changes for each live frame in window_change_record later. */ window_change_record_frames = true; - safe_call1 (XCAR (funs), window_or_frame); + safe_calln (XCAR (funs), window_or_frame); } funs = XCDR (funs); diff --git a/src/xdisp.c b/src/xdisp.c index 75d769600c4..1f571a2b221 100644 --- a/src/xdisp.c +++ b/src/xdisp.c @@ -3031,10 +3031,10 @@ hscrolling_current_line_p (struct window *w) Lisp form evaluation ***********************************************************************/ -/* Error handler for safe_eval and safe_call. */ +/* Error handler for dsafe_eval and dsafe_call. */ static Lisp_Object -safe_eval_handler (Lisp_Object arg, ptrdiff_t nargs, Lisp_Object *args) +dsafe_eval_handler (Lisp_Object arg, ptrdiff_t nargs, Lisp_Object *args) { add_to_log ("Error during redisplay: %S signaled %S", Flist (nargs, args), arg); @@ -3045,8 +3045,11 @@ safe_eval_handler (Lisp_Object arg, ptrdiff_t nargs, Lisp_Object *args) following. Return the result, or nil if something went wrong. Prevent redisplay during the evaluation. */ +/* FIXME: What's the guiding principle behind the choice + of which calls should set 'inhibit_quit' and which don't. */ static Lisp_Object -safe__call (bool inhibit_quit, ptrdiff_t nargs, Lisp_Object func, va_list ap) +dsafe__call (bool inhibit_quit, Lisp_Object (f) (ptrdiff_t, Lisp_Object *), + ptrdiff_t nargs, Lisp_Object *args) { Lisp_Object val; @@ -3054,84 +3057,38 @@ safe__call (bool inhibit_quit, ptrdiff_t nargs, Lisp_Object func, va_list ap) val = Qnil; else { - ptrdiff_t i; specpdl_ref count = SPECPDL_INDEX (); - Lisp_Object *args; - USE_SAFE_ALLOCA; - SAFE_ALLOCA_LISP (args, nargs); - - args[0] = func; - for (i = 1; i < nargs; i++) - args[i] = va_arg (ap, Lisp_Object); specbind (Qinhibit_redisplay, Qt); if (inhibit_quit) specbind (Qinhibit_quit, Qt); /* Use Qt to ensure debugger does not run, so there is no possibility of wanting to redisplay. */ - val = internal_condition_case_n (Ffuncall, nargs, args, Qt, - safe_eval_handler); - val = SAFE_FREE_UNBIND_TO (count, val); + val = internal_condition_case_n (f, nargs, args, Qt, + dsafe_eval_handler); + val = unbind_to (count, val); } return val; } -Lisp_Object -safe_call (ptrdiff_t nargs, Lisp_Object func, ...) -{ - Lisp_Object retval; - va_list ap; - - va_start (ap, func); - retval = safe__call (false, nargs, func, ap); - va_end (ap); - return retval; -} - -/* Call function FN with one argument ARG. - Return the result, or nil if something went wrong. */ - -Lisp_Object -safe_call1 (Lisp_Object fn, Lisp_Object arg) -{ - return safe_call (2, fn, arg); -} +#define SAFE_CALLMANY(inhibit_quit, f, array) \ + dsafe__call ((inhibit_quit), f, ARRAYELTS (array), array) +#define dsafe_calln(inhibit_quit, ...) \ + SAFE_CALLMANY ((inhibit_quit), Ffuncall, ((Lisp_Object []) {__VA_ARGS__})) static Lisp_Object -safe__call1 (bool inhibit_quit, Lisp_Object fn, ...) -{ - Lisp_Object retval; - va_list ap; - - va_start (ap, fn); - retval = safe__call (inhibit_quit, 2, fn, ap); - va_end (ap); - return retval; -} - -Lisp_Object -safe_eval (Lisp_Object sexpr) +dsafe_call1 (Lisp_Object f, Lisp_Object arg) { - return safe__call1 (false, Qeval, sexpr); + return dsafe_calln (false, f, arg); } static Lisp_Object -safe__eval (bool inhibit_quit, Lisp_Object sexpr) +dsafe_eval (Lisp_Object sexpr) { - return safe__call1 (inhibit_quit, Qeval, sexpr); + return dsafe_calln (true, Qeval, sexpr, Qt); } -/* Call function FN with two arguments ARG1 and ARG2. - Return the result, or nil if something went wrong. */ - -Lisp_Object -safe_call2 (Lisp_Object fn, Lisp_Object arg1, Lisp_Object arg2) -{ - return safe_call (3, fn, arg1, arg2); -} - - /*********************************************************************** Debugging @@ -4615,7 +4572,7 @@ handle_fontified_prop (struct it *it) it->f->inhibit_clear_image_cache = true; if (!CONSP (val) || EQ (XCAR (val), Qlambda)) - safe_call1 (val, pos); + dsafe_call1 (val, pos); else { Lisp_Object fns, fn; @@ -4639,11 +4596,11 @@ handle_fontified_prop (struct it *it) { fn = XCAR (fns); if (!EQ (fn, Qt)) - safe_call1 (fn, pos); + dsafe_call1 (fn, pos); } } else - safe_call1 (fn, pos); + dsafe_call1 (fn, pos); } } @@ -5855,7 +5812,7 @@ handle_single_display_spec (struct it *it, Lisp_Object spec, Lisp_Object object, /* Save and restore the bidi cache, since FORM could be crazy enough to re-enter redisplay, e.g., by calling 'message'. */ itdata = bidi_shelve_cache (); - form = safe_eval (form); + form = dsafe_eval (form); bidi_unshelve_cache (itdata, false); form = unbind_to (count, form); } @@ -5897,7 +5854,7 @@ handle_single_display_spec (struct it *it, Lisp_Object spec, Lisp_Object object, struct face *face = FACE_FROM_ID (it->f, it->face_id); Lisp_Object height; itdata = bidi_shelve_cache (); - height = safe_call1 (it->font_height, + height = dsafe_call1 (it->font_height, face->lface[LFACE_HEIGHT_INDEX]); bidi_unshelve_cache (itdata, false); if (NUMBERP (height)) @@ -5922,7 +5879,7 @@ handle_single_display_spec (struct it *it, Lisp_Object spec, Lisp_Object object, specbind (Qheight, face->lface[LFACE_HEIGHT_INDEX]); itdata = bidi_shelve_cache (); - value = safe_eval (it->font_height); + value = dsafe_eval (it->font_height); bidi_unshelve_cache (itdata, false); value = unbind_to (count, value); @@ -12801,7 +12758,7 @@ resize_mini_window (struct window *w, bool exact_p) displaying changes from under them. Such a resizing can happen, for instance, when which-func prints a long message while we are running fontification-functions. We're running these - functions with safe_call which binds inhibit-redisplay to t. */ + functions with dsafe_call which binds inhibit-redisplay to t. */ if (!NILP (Vinhibit_redisplay)) return false; @@ -12820,7 +12777,7 @@ resize_mini_window (struct window *w, bool exact_p) if (FRAME_MINIBUF_ONLY_P (f)) { if (!NILP (resize_mini_frames)) - safe_call1 (Qwindow__resize_mini_frame, WINDOW_FRAME (w)); + dsafe_call1 (Qwindow__resize_mini_frame, WINDOW_FRAME (w)); } else { @@ -13067,7 +13024,7 @@ set_message (Lisp_Object string) { specpdl_ref count = SPECPDL_INDEX (); specbind (Qinhibit_quit, Qt); - message = safe_call1 (Vset_message_function, string); + message = dsafe_call1 (Vset_message_function, string); unbind_to (count, Qnil); if (STRINGP (message)) @@ -13146,7 +13103,7 @@ clear_message (bool current_p, bool last_displayed_p) { specpdl_ref count = SPECPDL_INDEX (); specbind (Qinhibit_quit, Qt); - preserve = safe_call (1, Vclear_message_function); + preserve = dsafe_calln (false, Vclear_message_function); unbind_to (count, Qnil); } @@ -13757,7 +13714,7 @@ prepare_menu_bars (void) windows = Fcons (this, windows); } } - safe__call1 (true, Vpre_redisplay_function, windows); + dsafe_calln (true, Vpre_redisplay_function, windows); } /* Update all frame titles based on their buffer names, etc. We do @@ -18591,11 +18548,8 @@ run_window_scroll_functions (Lisp_Object window, struct text_pos startp) if (!NILP (Vwindow_scroll_functions)) { - specpdl_ref count = SPECPDL_INDEX (); - specbind (Qinhibit_quit, Qt); safe_run_hooks_2 (Qwindow_scroll_functions, window, make_fixnum (CHARPOS (startp))); - unbind_to (count, Qnil); SET_TEXT_POS_FROM_MARKER (startp, w->start); /* In case the hook functions switch buffers. */ set_buffer_internal (XBUFFER (w->contents)); @@ -18647,7 +18601,7 @@ cursor_row_fully_visible_p (struct window *w, bool force_p, XSETWINDOW (window, w); /* Implementation note: if the function we call here signals an error, we will NOT scroll when the cursor is partially-visible. */ - Lisp_Object val = safe_call1 (mclfv_p, window); + Lisp_Object val = dsafe_call1 (mclfv_p, window); if (NILP (val)) return true; else if (just_test_user_preference_p) @@ -20215,7 +20169,7 @@ redisplay_window (Lisp_Object window, bool just_this_one_p) propagated its info to `w' anyway. */ w->redisplay = false; XBUFFER (w->contents)->text->redisplay = false; - safe__call1 (true, Vpre_redisplay_function, Fcons (window, Qnil)); + dsafe_calln (true, Vpre_redisplay_function, Fcons (window, Qnil)); if (w->redisplay || XBUFFER (w->contents)->text->redisplay || ((EQ (Vdisplay_line_numbers, Qrelative) @@ -27092,7 +27046,7 @@ display_mode_lines (struct window *w) can reasonably tell whether a mouse click will select w. */ XSETWINDOW (window, w); if (FUNCTIONP (default_help)) - wset_mode_line_help_echo (w, safe_call1 (default_help, window)); + wset_mode_line_help_echo (w, dsafe_call1 (default_help, window)); else if (STRINGP (default_help)) wset_mode_line_help_echo (w, default_help); else @@ -27431,6 +27385,7 @@ display_mode_element (struct it *it, int depth, int field_width, int precision, /* PROPS might cause set-text-properties to signal an error, so we call it via internal_condition_case_n, to avoid an infloop in redisplay due to the error. */ + /* FIXME: Use 'SAFE_CALLMANY'? */ internal_condition_case_n (safe_set_text_properties, 4, ((Lisp_Object []) @@ -27438,7 +27393,7 @@ display_mode_element (struct it *it, int depth, int field_width, int precision, Flength (elt), props, elt}), - Qt, safe_eval_handler); + Qt, dsafe_eval_handler); /* Add this item to mode_line_proptrans_alist. */ mode_line_proptrans_alist = Fcons (Fcons (elt, props), @@ -27691,7 +27646,7 @@ display_mode_element (struct it *it, int depth, int field_width, int precision, if (CONSP (XCDR (elt))) { Lisp_Object spec; - spec = safe__eval (true, XCAR (XCDR (elt))); + spec = dsafe_eval (XCAR (XCDR (elt))); /* The :eval form could delete the frame stored in the iterator, which will cause a crash if we try to access faces and other fields (e.g., FRAME_KBOARD) @@ -28663,7 +28618,7 @@ decode_mode_spec (struct window *w, register int c, int field_width, Lisp_Object val = Qnil; if (STRINGP (curdir)) - val = safe_call1 (intern ("file-remote-p"), curdir); + val = dsafe_call1 (intern ("file-remote-p"), curdir); val = unbind_to (count, val); diff --git a/src/xfaces.c b/src/xfaces.c index 7385c4c7dd2..a6a20389f7d 100644 --- a/src/xfaces.c +++ b/src/xfaces.c @@ -2232,7 +2232,7 @@ merge_face_heights (Lisp_Object from, Lisp_Object to, Lisp_Object invalid) { /* Call function with current height as argument. From is the new height. */ - result = safe_call1 (from, to); + result = safe_calln (from, to); /* Ensure that if TO was absolute, so is the result. */ if (FIXNUMP (to) && !FIXNUMP (result)) diff --git a/src/xterm.c b/src/xterm.c index 79648a6d6e5..4aad78dc47b 100644 --- a/src/xterm.c +++ b/src/xterm.c @@ -5036,7 +5036,7 @@ x_dnd_note_self_drop (struct x_display_info *dpyinfo, Window target, XSETFRAME (lval, f); x_dnd_action = None; x_dnd_action_symbol - = safe_call2 (Vx_dnd_native_test_function, + = safe_calln (Vx_dnd_native_test_function, Fposn_at_x_y (make_fixnum (win_x), make_fixnum (win_y), lval, Qnil), @@ -27202,7 +27202,7 @@ xim_open_dpy (struct x_display_info *dpyinfo, char *resource_name) /* Now try to determine the coding system that should be used. locale is in Host Portable Character Encoding, and as such can be passed to build_string as is. */ - dpyinfo->xim_coding = safe_call1 (Vx_input_coding_function, + dpyinfo->xim_coding = safe_calln (Vx_input_coding_function, build_string (locale)); } } @@ -30661,7 +30661,7 @@ x_term_init (Lisp_Object display_name, char *xrm_option, char *resource_name) terminal_list = terminal->next_terminal; unblock_input (); kset_system_key_alist (terminal->kboard, - safe_call1 (Qvendor_specific_keysyms, + safe_calln (Qvendor_specific_keysyms, (vendor ? build_string (vendor) : empty_unibyte_string))); -- 2.39.2