(menu_bar_items): Save Vinhibit_quit by hand
authorRichard M. Stallman <rms@gnu.org>
Sat, 29 May 1993 17:58:03 +0000 (17:58 +0000)
committerRichard M. Stallman <rms@gnu.org>
Sat, 29 May 1993 17:58:03 +0000 (17:58 +0000)
instead of using specbind.

src/keyboard.c

index 9752789..0725bf2 100644 (file)
@@ -3059,8 +3059,6 @@ static Lisp_Object menu_bar_one_keymap ();
 Lisp_Object
 menu_bar_items ()
 {
-  int count = specpdl_ptr - specpdl;
-
   /* The number of keymaps we're scanning right now, and the number of
      keymaps we have allocated space for.  */
   int nmaps;
@@ -3074,12 +3072,16 @@ menu_bar_items ()
   Lisp_Object result;
 
   int mapno;
+  Lisp_Object oquit;
 
   /* In order to build the menus, we need to call the keymap
      accessors.  They all call QUIT.  But this function is called
      during redisplay, during which a quit is fatal.  So inhibit
-     quitting while building the menus.  */
-  specbind (Qinhibit_quit, Qt);
+     quitting while building the menus.
+     We do this instead of specbind because (1) errors will clear it anyway
+     and (2) this avoids risk of specpdl overflow.  */
+  oquit = Vinhibit_quit;
+  Vinhibit_quit = Qt; 
 
   /* Build our list of keymaps.
      If we recognize a function key and replace its escape sequence in
@@ -3116,7 +3118,8 @@ menu_bar_items ()
        result = menu_bar_one_keymap (def, result);
     }
 
-  return unbind_to (count, Fnreverse (result));
+  Vinhibit_quit = oquit;
+  return Fnreverse (result);
 }
 \f
 /* Scan one map KEYMAP, accumulating any menu items it defines