From 3a6ea7dce69ab4077d26348b743400cdcb1b5ea0 Mon Sep 17 00:00:00 2001 From: Pip Cet Date: Sat, 14 Mar 2020 15:36:41 +0000 Subject: [PATCH] Don't collect reachable killed buffers during GC * src/alloc.c (valid_buffer_holding): New function, returns true for valid killed buffers. (mark_maybe_object, mark_maybe_pointer): Use `valid_buffer_holding' rather than `live_buffer_holding'. --- src/alloc.c | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/src/alloc.c b/src/alloc.c index 1c6b664b22..bdadfdd318 100644 --- a/src/alloc.c +++ b/src/alloc.c @@ -4511,6 +4511,29 @@ live_buffer_p (struct mem_node *m, void *p) return !NILP (live_buffer_holding (m, p)); } +/* If P is a pointer into a buffer, killed or live, return the buffer. + Otherwise, return nil. M is a pointer to the mem_block for P. */ + +static Lisp_Object +valid_buffer_holding (struct mem_node *m, void *p) +{ + /* P must point into the block M. */ + if (m->type == MEM_TYPE_BUFFER) + { + struct buffer *b = m->start; + char *cb = m->start; + char *cp = p; + ptrdiff_t offset = cp - cb; + if (0 <= offset && offset < sizeof *b) + { + Lisp_Object obj; + XSETBUFFER (obj, b); + return obj; + } + } + return Qnil; +} + /* Mark OBJ if we can prove it's a Lisp_Object. */ static void @@ -4566,7 +4589,7 @@ mark_maybe_object (Lisp_Object obj) case Lisp_Vectorlike: mark_p = (EQ (obj, live_vector_holding (m, po)) - || EQ (obj, live_buffer_holding (m, po))); + || EQ (obj, valid_buffer_holding (m, po))); break; default: @@ -4636,7 +4659,7 @@ mark_maybe_pointer (void *p) break; case MEM_TYPE_BUFFER: - obj = live_buffer_holding (m, p); + obj = valid_buffer_holding (m, p); break; case MEM_TYPE_CONS: -- 2.25.1