diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/bytecode.c | 2 | ||||
-rw-r--r-- | src/charset.c | 6 | ||||
-rw-r--r-- | src/coding.c | 6 | ||||
-rw-r--r-- | src/eval.c | 37 | ||||
-rw-r--r-- | src/fileio.c | 2 | ||||
-rw-r--r-- | src/keyboard.c | 6 | ||||
-rw-r--r-- | src/lisp.h | 7 | ||||
-rw-r--r-- | src/nsmenu.m | 2 | ||||
-rw-r--r-- | src/term.c | 2 | ||||
-rw-r--r-- | src/w32fns.c | 2 | ||||
-rw-r--r-- | src/w32menu.c | 9 | ||||
-rw-r--r-- | src/xfns.c | 6 | ||||
-rw-r--r-- | src/xmenu.c | 6 |
13 files changed, 54 insertions, 39 deletions
diff --git a/src/bytecode.c b/src/bytecode.c index 05bc9fcdb0..ee1b79f182 100644 --- a/src/bytecode.c +++ b/src/bytecode.c @@ -386,7 +386,7 @@ relocate_byte_stack (void) Vquit_flag = Qnil; \ if (EQ (Vthrow_on_input, flag)) \ Fthrow (Vthrow_on_input, Qt); \ - Fsignal (Qquit, Qnil); \ + quit (); \ } \ else if (pending_signals) \ process_pending_signals (); \ diff --git a/src/charset.c b/src/charset.c index 95a9c577d5..05469aa265 100644 --- a/src/charset.c +++ b/src/charset.c @@ -843,9 +843,9 @@ usage: (define-charset-internal ...) */) int nchars; if (nargs != charset_arg_max) - return Fsignal (Qwrong_number_of_arguments, - Fcons (intern ("define-charset-internal"), - make_number (nargs))); + Fsignal (Qwrong_number_of_arguments, + Fcons (intern ("define-charset-internal"), + make_number (nargs))); attrs = Fmake_vector (make_number (charset_attr_max), Qnil); diff --git a/src/coding.c b/src/coding.c index 29c90f0a40..a8ddc81756 100644 --- a/src/coding.c +++ b/src/coding.c @@ -10546,9 +10546,9 @@ usage: (define-coding-system-internal ...) */) return Qnil; short_args: - return Fsignal (Qwrong_number_of_arguments, - Fcons (intern ("define-coding-system-internal"), - make_number (nargs))); + Fsignal (Qwrong_number_of_arguments, + Fcons (intern ("define-coding-system-internal"), + make_number (nargs))); } diff --git a/src/eval.c b/src/eval.c index 72facd5db6..33b82f74b6 100644 --- a/src/eval.c +++ b/src/eval.c @@ -1431,6 +1431,7 @@ push_handler_nosignal (Lisp_Object tag_ch_val, enum handlertype handlertype) } +static Lisp_Object signal_or_quit (Lisp_Object, Lisp_Object, bool); static Lisp_Object find_handler_clause (Lisp_Object, Lisp_Object); static bool maybe_call_debugger (Lisp_Object conditions, Lisp_Object sig, Lisp_Object data); @@ -1444,7 +1445,7 @@ process_quit_flag (void) Fkill_emacs (Qnil); if (EQ (Vthrow_on_input, flag)) Fthrow (Vthrow_on_input, Qt); - Fsignal (Qquit, Qnil); + quit (); } DEFUN ("signal", Fsignal, Ssignal, 2, 2, 0, @@ -1460,9 +1461,29 @@ DATA should be a list. Its elements are printed as part of the error message. See Info anchor `(elisp)Definition of signal' for some details on how this error message is constructed. If the signal is handled, DATA is made available to the handler. -See also the function `condition-case'. */) +See also the function `condition-case'. */ + attributes: noreturn) (Lisp_Object error_symbol, Lisp_Object data) { + signal_or_quit (error_symbol, data, false); + eassume (false); +} + +/* Quit, in response to a keyboard quit request. */ +Lisp_Object +quit (void) +{ + return signal_or_quit (Qquit, Qnil, true); +} + +/* Signal an error, or quit. ERROR_SYMBOL and DATA are as with Fsignal. + If KEYBOARD_QUIT, this is a quit; ERROR_SYMBOL should be + Qquit and DATA should be Qnil, and this function may return. + Otherwise this function is like Fsignal and does not return. */ + +static Lisp_Object +signal_or_quit (Lisp_Object error_symbol, Lisp_Object data, bool keyboard_quit) +{ /* When memory is full, ERROR-SYMBOL is nil, and DATA is (REAL-ERROR-SYMBOL . REAL-DATA). That is a special case--don't do this in other situations. */ @@ -1542,7 +1563,7 @@ See also the function `condition-case'. */) = maybe_call_debugger (conditions, error_symbol, data); /* We can't return values to code which signaled an error, but we can continue code which has signaled a quit. */ - if (debugger_called && EQ (real_error_symbol, Qquit)) + if (keyboard_quit && debugger_called && EQ (real_error_symbol, Qquit)) return Qnil; } @@ -1569,16 +1590,6 @@ See also the function `condition-case'. */) fatal ("%s", SDATA (string)); } -/* Internal version of Fsignal that never returns. - Used for anything but Qquit (which can return from Fsignal). */ - -void -xsignal (Lisp_Object error_symbol, Lisp_Object data) -{ - Fsignal (error_symbol, data); - emacs_abort (); -} - /* Like xsignal, but takes 0, 1, 2, or 3 args instead of a list. */ void diff --git a/src/fileio.c b/src/fileio.c index b1f9d3cf73..66ea761ca5 100644 --- a/src/fileio.c +++ b/src/fileio.c @@ -4513,7 +4513,7 @@ by calling `format-decode', which see. */) PT - BEG, Z - PT - inserted); if (read_quit) - Fsignal (Qquit, Qnil); + quit (); /* Retval needs to be dealt with in all cases consistently. */ if (NILP (val)) diff --git a/src/keyboard.c b/src/keyboard.c index 8901ff055e..ed4968486c 100644 --- a/src/keyboard.c +++ b/src/keyboard.c @@ -696,7 +696,7 @@ recursive_edit_1 (void) val = command_loop (); if (EQ (val, Qt)) - Fsignal (Qquit, Qnil); + quit (); /* Handle throw from read_minibuf when using minibuffer while it's active but we're in another window. */ if (STRINGP (val)) @@ -7581,7 +7581,7 @@ menu_item_eval_property_1 (Lisp_Object arg) /* If we got a quit from within the menu computation, quit all the way out of it. This takes care of C-] in the debugger. */ if (CONSP (arg) && EQ (XCAR (arg), Qquit)) - Fsignal (Qquit, Qnil); + quit (); return Qnil; } @@ -10407,7 +10407,7 @@ handle_interrupt (bool in_signal_handler) immediate_quit = false; pthread_sigmask (SIG_SETMASK, &empty_mask, 0); saved = gl_state; - Fsignal (Qquit, Qnil); + quit (); gl_state = saved; } else diff --git a/src/lisp.h b/src/lisp.h index 39877d7bb4..089f3977cd 100644 --- a/src/lisp.h +++ b/src/lisp.h @@ -3879,7 +3879,12 @@ extern void run_hook_with_args_2 (Lisp_Object, Lisp_Object, Lisp_Object); extern Lisp_Object run_hook_with_args (ptrdiff_t nargs, Lisp_Object *args, Lisp_Object (*funcall) (ptrdiff_t nargs, Lisp_Object *args)); -extern _Noreturn void xsignal (Lisp_Object, Lisp_Object); +extern Lisp_Object quit (void); +INLINE _Noreturn void +xsignal (Lisp_Object error_symbol, Lisp_Object data) +{ + Fsignal (error_symbol, data); +} extern _Noreturn void xsignal0 (Lisp_Object); extern _Noreturn void xsignal1 (Lisp_Object, Lisp_Object); extern _Noreturn void xsignal2 (Lisp_Object, Lisp_Object, Lisp_Object); diff --git a/src/nsmenu.m b/src/nsmenu.m index 83ded6daca..d1f4b020bb 100644 --- a/src/nsmenu.m +++ b/src/nsmenu.m @@ -1843,7 +1843,7 @@ ns_popup_dialog (struct frame *f, Lisp_Object header, Lisp_Object contents) if (EQ (ret, Qundefined) && window_closed) /* Make close button pressed equivalent to C-g. */ - Fsignal (Qquit, Qnil); + quit (); return ret; } diff --git a/src/term.c b/src/term.c index 81908b370a..d54ff115f9 100644 --- a/src/term.c +++ b/src/term.c @@ -3759,7 +3759,7 @@ tty_menu_show (struct frame *f, int x, int y, int menuflags, /* Make "Cancel" equivalent to C-g unless FOR_CLICK (which means the menu was invoked with a mouse event as POSITION). */ if (!(menuflags & MENU_FOR_CLICK)) - Fsignal (Qquit, Qnil); + quit (); break; } diff --git a/src/w32fns.c b/src/w32fns.c index d6b54d19a1..584e311230 100644 --- a/src/w32fns.c +++ b/src/w32fns.c @@ -7584,7 +7584,7 @@ value of DIR as in previous invocations; this is standard Windows behavior. */) /* Make "Cancel" equivalent to C-g. */ if (NILP (filename)) - Fsignal (Qquit, Qnil); + quit (); return filename; } diff --git a/src/w32menu.c b/src/w32menu.c index 13296d9d85..7c66360bec 100644 --- a/src/w32menu.c +++ b/src/w32menu.c @@ -827,7 +827,7 @@ w32_menu_show (struct frame *f, int x, int y, int menuflags, { unblock_input (); /* Make "Cancel" equivalent to C-g. */ - Fsignal (Qquit, Qnil); + quit (); } unblock_input (); @@ -1019,7 +1019,7 @@ w32_dialog_show (struct frame *f, Lisp_Object title, } else /* Make "Cancel" equivalent to C-g. */ - Fsignal (Qquit, Qnil); + quit (); return Qnil; } @@ -1155,7 +1155,7 @@ simple_dialog_show (struct frame *f, Lisp_Object contents, Lisp_Object header) else if (answer == IDNO) lispy_answer = build_string ("No"); else - Fsignal (Qquit, Qnil); + quit (); for (temp = XCDR (contents); CONSP (temp); temp = XCDR (temp)) { @@ -1177,8 +1177,7 @@ simple_dialog_show (struct frame *f, Lisp_Object contents, Lisp_Object header) return value; } } - Fsignal (Qquit, Qnil); - return Qnil; + return quit (); } #endif /* !HAVE_DIALOGS */ diff --git a/src/xfns.c b/src/xfns.c index 798dc49bef..c44997b3d6 100644 --- a/src/xfns.c +++ b/src/xfns.c @@ -6346,7 +6346,7 @@ value of DIR as in previous invocations; this is standard Windows behavior. */) /* Make "Cancel" equivalent to C-g. */ if (NILP (file)) - Fsignal (Qquit, Qnil); + quit (); decoded_file = DECODE_FILE (file); @@ -6418,7 +6418,7 @@ value of DIR as in previous invocations; this is standard Windows behavior. */) /* Make "Cancel" equivalent to C-g. */ if (NILP (file)) - Fsignal (Qquit, Qnil); + quit (); decoded_file = DECODE_FILE (file); @@ -6469,7 +6469,7 @@ nil, it defaults to the selected frame. */) unblock_input (); if (NILP (font)) - Fsignal (Qquit, Qnil); + quit (); return unbind_to (count, font); } diff --git a/src/xmenu.c b/src/xmenu.c index 9e1a817946..9ab7bdf971 100644 --- a/src/xmenu.c +++ b/src/xmenu.c @@ -1649,7 +1649,7 @@ x_menu_show (struct frame *f, int x, int y, int menuflags, { unblock_input (); /* Make "Cancel" equivalent to C-g. */ - Fsignal (Qquit, Qnil); + quit (); } unblock_input (); @@ -1913,7 +1913,7 @@ x_dialog_show (struct frame *f, Lisp_Object title, } else /* Make "Cancel" equivalent to C-g. */ - Fsignal (Qquit, Qnil); + quit (); return Qnil; } @@ -2304,7 +2304,7 @@ x_menu_show (struct frame *f, int x, int y, int menuflags, if (!(menuflags & MENU_FOR_CLICK)) { unblock_input (); - Fsignal (Qquit, Qnil); + quit (); } break; } |