]> git.eshelyaron.com Git - emacs.git/commitdiff
* src/window.c (select_window): Don't record_buffer while the invariant is
authorStefan Monnier <monnier@iro.umontreal.ca>
Mon, 8 Apr 2013 18:04:58 +0000 (14:04 -0400)
committerStefan Monnier <monnier@iro.umontreal.ca>
Mon, 8 Apr 2013 18:04:58 +0000 (14:04 -0400)
temporarily broken.
* src/fns.c (Fdelq): Don't assume !NILP => CONSP.

Fixes: debbugs:14161
src/ChangeLog
src/fns.c
src/keyboard.c
src/window.c

index cb6930f9acc3c0d655c4106ce7b51129fd454bd0..04dcee7b6eb32d04eeec46a2f5fab3df2d45cdc0 100644 (file)
@@ -1,3 +1,10 @@
+2013-04-08  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+       * window.c (select_window): Don't record_buffer while the invariant is
+       temporarily broken (bug#14161).
+
+       * fns.c (Fdelq): Don't assume !NILP => CONSP.
+
 2013-04-07  Eli Zaretskii  <eliz@gnu.org>
 
        * fileio.c (ACL_NOT_WELL_SUPPORTED): Define macro for WINDOWSNT.
index 86bdc0250dcca98a95d6f72e114b8ae10aa82bd8..08c6f055f38746d862e28e497f49193733583bf1 100644 (file)
--- a/src/fns.c
+++ b/src/fns.c
@@ -1551,7 +1551,7 @@ the value of a list `foo'.  */)
 
   tail = list;
   prev = Qnil;
-  while (!NILP (tail))
+  while (CONSP (tail))
     {
       CHECK_LIST_CONS (tail, list);
       tem = XCAR (tail);
index beba3025887c2a2a323a34ad6e43ce2e9d611e5e..b4fafa22e41b868f882302339db621ce07325792 100644 (file)
@@ -72,7 +72,7 @@ along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.  */
 #include TERM_HEADER
 #endif /* HAVE_WINDOW_SYSTEM */
 
-/* Variables for blockinput.h: */
+/* Variables for blockinput.h:  */
 
 /* Positive if interrupt input is blocked right now.  */
 volatile int interrupt_input_blocked;
@@ -4337,10 +4337,10 @@ timer_check_2 (Lisp_Object timers, Lisp_Object idle_timers)
            }
 
          idle_timer_ripe = EMACS_TIME_LE (idle_timer_time, idleness_now);
-         idle_timer_difference =
-           (idle_timer_ripe
-            ? sub_emacs_time (idleness_now, idle_timer_time)
-            : sub_emacs_time (idle_timer_time, idleness_now));
+         idle_timer_difference
+           (idle_timer_ripe
+              ? sub_emacs_time (idleness_now, idle_timer_time)
+              : sub_emacs_time (idle_timer_time, idleness_now));
        }
 
       /* Decide which timer is the next timer,
index feb5f7b5cc7be8369bfc774a72b293b755dbd35c..2ddf742be993ba6df18faca26115c5a93053161f 100644 (file)
@@ -485,12 +485,6 @@ select_window (Lisp_Object window, Lisp_Object norecord, int inhibit_point_swap)
   w = XWINDOW (window);
   w->frozen_window_start_p = 0;
 
-  if (NILP (norecord))
-    {
-      w->use_time = ++window_select_count;
-      record_buffer (w->contents);
-    }
-
   /* Make the selected window's buffer current.  */
   Fset_buffer (w->contents);
 
@@ -515,6 +509,15 @@ select_window (Lisp_Object window, Lisp_Object norecord, int inhibit_point_swap)
 
   select_window_1 (window, inhibit_point_swap);
 
+  /* record_buffer can run QUIT, so make sure it is run only after we have
+     re-established the invariant between selected_window and selected_frame,
+     otherwise the temporary broken invariant might "escape" (bug#14161).  */
+  if (NILP (norecord))
+    {
+      w->use_time = ++window_select_count;
+      record_buffer (w->contents);
+    }
+
   bset_last_selected_window (XBUFFER (w->contents), window);
   windows_or_buffers_changed++;
   return window;
@@ -2929,7 +2932,7 @@ window-start value is reasonable when this function is called.  */)
 
   replace_window (root, window, 1);
 
-  /* This must become SWINDOW anyway ....... */
+  /* This must become SWINDOW anyway .......  */
   if (BUFFERP (w->contents) && !resize_failed)
     {
       /* Try to minimize scrolling, by setting the window start to the