From d562402198a0341e5a1bbfff4f0e8ea0df63d484 Mon Sep 17 00:00:00 2001 From: Pip Cet Date: Thu, 12 Mar 2020 19:47:10 +0000 Subject: [PATCH] recurse into symbol values rather than along the symbol chain when GCing --- src/alloc.c | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/src/alloc.c b/src/alloc.c index 1c6b664b22..0db9620f3e 100644 --- a/src/alloc.c +++ b/src/alloc.c @@ -6581,9 +6581,19 @@ #define CHECK_ALLOCATED_AND_LIVE_SYMBOL() ((void) 0) eassert (valid_lisp_object_p (ptr->u.s.function)); mark_object (ptr->u.s.function); mark_object (ptr->u.s.plist); + if (!PURE_P (XSTRING (ptr->u.s.name))) + set_string_marked (XSTRING (ptr->u.s.name)); + mark_interval_tree (string_intervals (ptr->u.s.name)); switch (ptr->u.s.redirect) { - case SYMBOL_PLAINVAL: mark_object (SYMBOL_VAL (ptr)); break; + case SYMBOL_PLAINVAL: + if (!ptr->u.s.next) + { + obj = SYMBOL_VAL (ptr); + goto loop; + } + mark_object (SYMBOL_VAL (ptr)); + break; case SYMBOL_VARALIAS: { Lisp_Object tem; @@ -6602,9 +6612,6 @@ #define CHECK_ALLOCATED_AND_LIVE_SYMBOL() ((void) 0) break; default: emacs_abort (); } - if (!PURE_P (XSTRING (ptr->u.s.name))) - set_string_marked (XSTRING (ptr->u.s.name)); - mark_interval_tree (string_intervals (ptr->u.s.name)); /* Inner loop to mark next symbol in this bucket, if any. */ po = ptr = ptr->u.s.next; if (ptr) -- 2.25.1