From 30e3190aac82c3a218fa2d435b37f04ab427e674 Mon Sep 17 00:00:00 2001 From: "Richard M. Stallman" Date: Mon, 2 Jan 1995 09:15:25 +0000 Subject: [PATCH] (mark_buffer, gc_sweep): Use BUF_INTERVALS. (mark_buffer): In indirect buffer, mark the base buffer. (mark_object): Make buffer case a branch of the Lisp_Vectorlike case. --- src/alloc.c | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/src/alloc.c b/src/alloc.c index 1d55fc50d0..d1733b351d 100644 --- a/src/alloc.c +++ b/src/alloc.c @@ -1523,7 +1523,9 @@ mark_object (objptr) break; case Lisp_Vectorlike: - if (GC_SUBRP (obj)) + if (GC_BUFFERP (obj)) + mark_buffer (obj); + else if (GC_SUBRP (obj)) break; else if (GC_COMPILEDP (obj)) /* We could treat this just like a vector, but it is better @@ -1703,11 +1705,6 @@ mark_object (objptr) break; #endif /* LISP_FLOAT_TYPE */ - case Lisp_Buffer: - if (!XMARKBIT (XBUFFER (obj)->name)) - mark_buffer (obj); - break; - case Lisp_Int: break; @@ -1724,12 +1721,13 @@ mark_buffer (buf) { register struct buffer *buffer = XBUFFER (buf); register Lisp_Object *ptr; + Lisp_Object base_buffer; /* This is the buffer's markbit */ mark_object (&buffer->name); XMARK (buffer->name); - MARK_INTERVAL_TREE (buffer->intervals); + MARK_INTERVAL_TREE (BUF_INTERVALS (buffer)); #if 0 mark_object (buffer->syntax_table); @@ -1753,6 +1751,13 @@ mark_buffer (buf) (char *)ptr < (char *)buffer + sizeof (struct buffer); ptr++) mark_object (ptr); + + /* If this is an indirect buffer, mark its base buffer. */ + if (buffer->base_buffer) + { + XSETBUFFER (base_buffer, buffer->base_buffer); + mark_buffer (base_buffer); + } } /* Sweep: find all structures not marked, and free them. */ @@ -1970,7 +1975,7 @@ gc_sweep () else { XUNMARK (buffer->name); - UNMARK_BALANCE_INTERVALS (buffer->intervals); + UNMARK_BALANCE_INTERVALS (BUF_INTERVALS (buffer)); #if 0 /* Each `struct Lisp_String *' was turned into a Lisp_Object -- 2.20.1