mirror of
https://git.savannah.gnu.org/git/emacs.git
synced 2025-01-26 19:18:50 +00:00
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.
This commit is contained in:
parent
c1ca42cae6
commit
697e1e393c
@ -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,
|
||||
|
64
src/alloc.c
64
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;
|
||||
|
Loading…
Reference in New Issue
Block a user