emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

master cbf5bdd: Don't allow quitting while rebuilding Vwindow_list (Bug#


From: Martin Rudalics
Subject: master cbf5bdd: Don't allow quitting while rebuilding Vwindow_list (Bug#47244)
Date: Sat, 17 Apr 2021 03:52:18 -0400 (EDT)

branch: master
commit cbf5bdd2538b92139603e7ab7ff17e4957bad7c6
Author: Martin Rudalics <rudalics@gmx.at>
Commit: Martin Rudalics <rudalics@gmx.at>

    Don't allow quitting while rebuilding Vwindow_list (Bug#47244)
    
    * src/window.c (window_list, next_window, window_list_1): Don't
    allow quitting in Fnconc and Fmemq (Bug#47244).
---
 src/window.c | 21 +++++++++++++++++++++
 1 file changed, 21 insertions(+)

diff --git a/src/window.c b/src/window.c
index caf9df6..7c238a3 100644
--- a/src/window.c
+++ b/src/window.c
@@ -2542,8 +2542,13 @@ window_list (void)
   if (!CONSP (Vwindow_list))
     {
       Lisp_Object tail, frame;
+      ptrdiff_t count = SPECPDL_INDEX ();
 
       Vwindow_list = Qnil;
+      /*  Don't allow quitting in Fnconc.  Otherwise we might end up
+         with a too short Vwindow_list and Fkill_buffer not being able
+         to replace a buffer in all windows showing it (Bug#47244).  */
+      specbind (Qinhibit_quit, Qt);
       FOR_EACH_FRAME (tail, frame)
        {
          Lisp_Object arglist = Qnil;
@@ -2555,6 +2560,8 @@ window_list (void)
          arglist = Fnreverse (arglist);
          Vwindow_list = nconc2 (Vwindow_list, arglist);
        }
+
+      unbind_to (count, Qnil);
     }
 
   return Vwindow_list;
@@ -2691,6 +2698,8 @@ static Lisp_Object
 next_window (Lisp_Object window, Lisp_Object minibuf, Lisp_Object all_frames,
             bool next_p)
 {
+  ptrdiff_t count = SPECPDL_INDEX ();
+
   decode_next_window_args (&window, &minibuf, &all_frames);
 
   /* If ALL_FRAMES is a frame, and WINDOW isn't on that frame, just
@@ -2699,6 +2708,9 @@ next_window (Lisp_Object window, Lisp_Object minibuf, 
Lisp_Object all_frames,
       && !EQ (all_frames, XWINDOW (window)->frame))
     return Fframe_first_window (all_frames);
 
+  /*  Don't allow quitting in Fmemq.  */
+  specbind (Qinhibit_quit, Qt);
+
   if (next_p)
     {
       Lisp_Object list;
@@ -2748,6 +2760,8 @@ next_window (Lisp_Object window, Lisp_Object minibuf, 
Lisp_Object all_frames,
        window = candidate;
     }
 
+  unbind_to (count, Qnil);
+
   return window;
 }
 
@@ -2838,10 +2852,14 @@ static Lisp_Object
 window_list_1 (Lisp_Object window, Lisp_Object minibuf, Lisp_Object all_frames)
 {
   Lisp_Object tail, list, rest;
+  ptrdiff_t count = SPECPDL_INDEX ();
 
   decode_next_window_args (&window, &minibuf, &all_frames);
   list = Qnil;
 
+  /*  Don't allow quitting in Fmemq and Fnconc.  */
+  specbind (Qinhibit_quit, Qt);
+
   for (tail = window_list (); CONSP (tail); tail = XCDR (tail))
     if (candidate_window_p (XCAR (tail), window, minibuf, all_frames))
       list = Fcons (XCAR (tail), list);
@@ -2856,6 +2874,9 @@ window_list_1 (Lisp_Object window, Lisp_Object minibuf, 
Lisp_Object all_frames)
       XSETCDR (tail, Qnil);
       list = nconc2 (rest, list);
     }
+
+  unbind_to (count, Qnil);
+
   return list;
 }
 



reply via email to

[Prev in Thread] Current Thread [Next in Thread]