summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry Antipov <dmantipov@yandex.ru>2012-09-05 19:34:45 +0400
committerDmitry Antipov <dmantipov@yandex.ru>2012-09-05 19:34:45 +0400
commit697e1e393c9cd70acf35da9700a25b6367b7da40 (patch)
tree4efa0f705bf328ffe34e31de9b504c8e9f782923
parentc1ca42cae6eb3f13b0bf513c7131778cba228b8a (diff)
downloademacs-697e1e393c9cd70acf35da9700a25b6367b7da40.tar.gz
emacs-697e1e393c9cd70acf35da9700a25b6367b7da40.tar.bz2
emacs-697e1e393c9cd70acf35da9700a25b6367b7da40.zip
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.
-rw-r--r--src/ChangeLog6
-rw-r--r--src/alloc.c64
2 files changed, 48 insertions, 22 deletions
diff --git a/src/ChangeLog b/src/ChangeLog
index 3d2e25f7828..a0c3f3537bb 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,5 +1,11 @@
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,
buffer_defaults and buffer_local_symbols as valid objects.
Return special value to denote them.
diff --git a/src/alloc.c b/src/alloc.c
index 80ab2d2cb97..e90cca637df 100644
--- a/src/alloc.c
+++ b/src/alloc.c
@@ -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;