]> git.eshelyaron.com Git - emacs.git/commitdiff
Do not mark objects from deleted buffers, windows and frames.
authorDmitry Antipov <dmantipov@yandex.ru>
Wed, 5 Sep 2012 15:34:45 +0000 (19:34 +0400)
committerDmitry Antipov <dmantipov@yandex.ru>
Wed, 5 Sep 2012 15:34:45 +0000 (19:34 +0400)
* alloc.c (mark_buffer): Mark just the buffer if it is dead.
(mark_object): Likewise for windows and frames.

src/ChangeLog
src/alloc.c

index 3d2e25f7828c8f27a5abd6f2d59820cd155dab59..a0c3f3537bbf9830b2f754f1651c4ecf7090bb54 100644 (file)
@@ -1,3 +1,9 @@
+2012-09-05  Dmitry Antipov  <dmantipov@yandex.ru>
+
+       Do not mark objects from deleted buffers, windows and frames.
+       * alloc.c (mark_buffer): Mark just the buffer if it is dead.
+       (mark_object): Likewise for windows and frames.
+
 2012-09-05  Dmitry Antipov  <dmantipov@yandex.ru>
 
        * alloc.c (valid_lisp_object_p): Treat killed buffers,
index 80ab2d2cb978195ed1b5329b84205a1e51a1e77e..e90cca637dffb548fa1d77648be613cf2e27e488 100644 (file)
@@ -5838,23 +5838,29 @@ mark_overlay (struct Lisp_Overlay *ptr)
 static void
 mark_buffer (struct buffer *buffer)
 {
-  /* This is handled much like other pseudovectors...  */
-  mark_vectorlike ((struct Lisp_Vector *) buffer);
+  if (NILP (BVAR (buffer, name)))
+    /* If the buffer is killed, mark just the buffer itself.  */
+    VECTOR_MARK (buffer);
+  else
+    {
+      /* This is handled much like other pseudovectors...  */
+      mark_vectorlike ((struct Lisp_Vector *) buffer);
 
-  /* ...but there are some buffer-specific things.  */
+      /* ...but there are some buffer-specific things.  */
 
-  MARK_INTERVAL_TREE (buffer_intervals (buffer));
+      MARK_INTERVAL_TREE (buffer_intervals (buffer));
 
-  /* For now, we just don't mark the undo_list.  It's done later in
-     a special way just before the sweep phase, and after stripping
-     some of its elements that are not needed any more.  */
+      /* For now, we just don't mark the undo_list.  It's done later in
+        a special way just before the sweep phase, and after stripping
+        some of its elements that are not needed any more.  */
 
-  mark_overlay (buffer->overlays_before);
-  mark_overlay (buffer->overlays_after);
+      mark_overlay (buffer->overlays_before);
+      mark_overlay (buffer->overlays_after);
 
-  /* If this is an indirect buffer, mark its base buffer.  */
-  if (buffer->base_buffer && !VECTOR_MARKED_P (buffer->base_buffer))
-    mark_buffer (buffer->base_buffer);
+      /* If this is an indirect buffer, mark its base buffer.  */
+      if (buffer->base_buffer && !VECTOR_MARKED_P (buffer->base_buffer))
+       mark_buffer (buffer->base_buffer);
+    }
 }
 
 /* Determine type of generic Lisp_Object and mark it accordingly.  */
@@ -5997,24 +6003,38 @@ mark_object (Lisp_Object arg)
 
          case PVEC_FRAME:
            {
-             mark_vectorlike (ptr);
-             mark_face_cache (((struct frame *) ptr)->face_cache);
+             struct frame *f = (struct frame *) ptr;
+
+             if (FRAME_LIVE_P (f))
+               {
+                 mark_vectorlike (ptr);
+                 mark_face_cache (f->face_cache);
+               }
+             else
+               /* If the frame is deleted, mark just the frame itself.  */
+               VECTOR_MARK (ptr);
            }
            break;
 
          case PVEC_WINDOW:
            {
              struct window *w = (struct window *) ptr;
+             bool leaf = NILP (w->hchild) && NILP (w->vchild);
 
-             mark_vectorlike (ptr);
-             /* Mark glyphs for leaf windows.  Marking window
-                matrices is sufficient because frame matrices
-                use the same glyph memory.  */
-             if (NILP (w->hchild) && NILP (w->vchild)
-                 && w->current_matrix)
+             if (leaf && NILP (w->buffer))
+               /* If the window is deleted, mark just the window itself.  */
+               VECTOR_MARK (ptr);
+             else
                {
-                 mark_glyph_matrix (w->current_matrix);
-                 mark_glyph_matrix (w->desired_matrix);
+                 mark_vectorlike (ptr);
+                 /* Mark glyphs for leaf windows.  Marking window
+                    matrices is sufficient because frame matrices
+                    use the same glyph memory.  */
+                 if (leaf && w->current_matrix)
+                   {
+                     mark_glyph_matrix (w->current_matrix);
+                     mark_glyph_matrix (w->desired_matrix);
+                   }
                }
            }
            break;