# HG changeset patch # User Karl Heuer # Date 768548900 0 # Node ID e14086d8ba6f25e671d92664f8bf230ff0de47e9 # Parent 2ea6fdd2dacff4e47b1599098583e5c9d1909d15 (safe_run_hooks): New function, extracted from command_loop_1. Bind inhibit_quit. diff -r 2ea6fdd2dacf -r e14086d8ba6f src/keyboard.c --- a/src/keyboard.c Tue May 10 05:45:24 1994 +0000 +++ b/src/keyboard.c Tue May 10 05:48:20 1994 +0000 @@ -900,6 +900,7 @@ Lisp_Object Fcommand_execute (); static int read_key_sequence (); +static void safe_run_hooks (); Lisp_Object command_loop_1 () @@ -926,16 +927,7 @@ /* Make sure this hook runs after commands that get errors and throw to top level. */ if (!NILP (Vpost_command_hook) && !NILP (Vrun_hooks)) - { - /* If we get an error during the post-command-hook, - cause post-command-hook to be nil. */ - Vcommand_hook_internal = Vpost_command_hook; - Vpost_command_hook = Qnil; - - call1 (Vrun_hooks, Qcommand_hook_internal); - - Vpost_command_hook = Vcommand_hook_internal; - } + safe_run_hooks (&Vpost_command_hook); /* Do this after running Vpost_command_hook, for consistency. */ last_command = this_command; @@ -1057,16 +1049,7 @@ this_command = cmd; if (!NILP (Vpre_command_hook) && !NILP (Vrun_hooks)) - { - /* If we get an error during the pre-command-hook, - cause pre-command-hook to be nil. */ - Vcommand_hook_internal = Vpre_command_hook; - Vpre_command_hook = Qnil; - - call1 (Vrun_hooks, Qcommand_hook_internal); - - Vpre_command_hook = Vcommand_hook_internal; - } + safe_run_hooks (&Vpre_command_hook); if (NILP (this_command)) { @@ -1194,16 +1177,7 @@ directly_done: ; if (!NILP (Vpost_command_hook) && !NILP (Vrun_hooks)) - { - /* If we get an error during the post-command-hook, - cause post-command-hook to be nil. */ - Vcommand_hook_internal = Vpost_command_hook; - Vpost_command_hook = Qnil; - - call1 (Vrun_hooks, Qcommand_hook_internal); - - Vpost_command_hook = Vcommand_hook_internal; - } + safe_run_hooks (&Vpost_command_hook); /* If there is a prefix argument, 1) We don't want last_command to be ``universal-argument'' @@ -1233,6 +1207,24 @@ } } } + +/* 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; +{ + int count = specpdl_ptr - specpdl; + specbind (Qinhibit_quit, Qt); + + Vcommand_hook_internal = *hook; + *hook = Qnil; + call1 (Vrun_hooks, Qcommand_hook_internal); + *hook = Vcommand_hook_internal; + + unbind_to (count, Qnil); +} /* Number of seconds between polling for input. */ int polling_period;