changeset 7428:e14086d8ba6f

(safe_run_hooks): New function, extracted from command_loop_1. Bind inhibit_quit.
author Karl Heuer <kwzh@gnu.org>
date Tue, 10 May 1994 05:48:20 +0000
parents 2ea6fdd2dacf
children 5c2347e34b31
files src/keyboard.c
diffstat 1 files changed, 22 insertions(+), 30 deletions(-) [+]
line wrap: on
line diff
--- 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;