From: Richard M. Stallman Date: Mon, 24 Apr 1995 21:50:39 +0000 (+0000) Subject: (safe_run_hooks_1, safe_run_hooks_error): New subroutines. X-Git-Tag: emacs-19.34~4318 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=0bc3db2b9dba8fe1b8f28ab3d3e2aaf754d01e54;p=emacs.git (safe_run_hooks_1, safe_run_hooks_error): New subroutines. (safe_run_hooks): Handle errors to clear the hook, instead of always clearing it temporarily. --- diff --git a/src/keyboard.c b/src/keyboard.c index 623ea4efd19..de23b958568 100644 --- a/src/keyboard.c +++ b/src/keyboard.c @@ -1401,23 +1401,37 @@ command_loop_1 () } } +/* Subroutine for safe_run_hooks: run the hook HOOK. */ + +static Lisp_Object +safe_run_hooks_1 (hook) + Lisp_Object hook; +{ + return call1 (Vrun_hooks, Vinhibit_quit); +} + +/* Subroutine for safe_run_hooks: handle an error by clearing out the hook. */ + +static Lisp_Object +safe_run_hooks_error (data) + Lisp_Object data; +{ + Fset (Vinhibit_quit, Qnil); +} + /* If we get an error while running the hook, cause the hook variable to be nil. Also inhibit quits, so that C-g won't cause the hook to mysteriously evaporate. */ + static void safe_run_hooks (hook) Lisp_Object hook; { Lisp_Object value; int count = specpdl_ptr - specpdl; - specbind (Qinhibit_quit, Qt); - - /* We read and set the variable with functions, - in case it's buffer-local. */ - value = Vcommand_hook_internal = Fsymbol_value (hook); - Fset (hook, Qnil); - call1 (Vrun_hooks, Qcommand_hook_internal); - Fset (hook, value); + specbind (Qinhibit_quit, hook); + + internal_condition_case (safe_run_hooks_1, Qerror, safe_run_hooks_error); unbind_to (count, Qnil); }