From d285b373956fbe32141a491729cd84f190413e17 Mon Sep 17 00:00:00 2001 From: Gerd Moellmann Date: Wed, 6 Dec 2000 21:05:09 +0000 Subject: [PATCH] (gc_sweep): Prevent symbols read during loadup from being freed. --- src/ChangeLog | 3 +++ src/alloc.c | 41 ++++++++++++++++++++++++----------------- 2 files changed, 27 insertions(+), 17 deletions(-) diff --git a/src/ChangeLog b/src/ChangeLog index 9783d88397a..2c34188c8d6 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -14,6 +14,9 @@ 2000-12-06 Gerd Moellmann + * alloc.c (gc_sweep): Prevent symbols read during loadup + from being freed. + * xdisp.c (underlying_face_id): New function. (handle_face_prop, face_before_or_after_it_pos): Use it to determine the face ``under'' a string. Let strings inherit diff --git a/src/alloc.c b/src/alloc.c index 23ab3a3bcd2..83007657e20 100644 --- a/src/alloc.c +++ b/src/alloc.c @@ -4764,29 +4764,36 @@ gc_sweep () register int lim = symbol_block_index; register int num_free = 0, num_used = 0; - symbol_free_list = 0; + symbol_free_list = NULL; for (sblk = symbol_block; sblk; sblk = *sprev) { - register int i; int this_free = 0; - for (i = 0; i < lim; i++) - if (!XMARKBIT (sblk->symbols[i].plist)) - { - *(struct Lisp_Symbol **)&sblk->symbols[i].value = symbol_free_list; - symbol_free_list = &sblk->symbols[i]; + struct Lisp_Symbol *sym = sblk->symbols; + struct Lisp_Symbol *end = sym + lim; + + for (; sym < end; ++sym) + { + int pure_p = PURE_POINTER_P (sym->name); + + if (!XMARKBIT (sym->plist) && !pure_p) + { + *(struct Lisp_Symbol **) &sym->value = symbol_free_list; + symbol_free_list = sym; #if GC_MARK_STACK - symbol_free_list->function = Vdead; + symbol_free_list->function = Vdead; #endif - this_free++; - } - else - { - num_used++; - if (!PURE_POINTER_P (sblk->symbols[i].name)) - UNMARK_STRING (sblk->symbols[i].name); - XUNMARK (sblk->symbols[i].plist); - } + ++this_free; + } + else + { + ++num_used; + if (!pure_p) + UNMARK_STRING (sym->name); + XUNMARK (sym->plist); + } + } + lim = SYMBOL_BLOCK_SIZE; /* If this block contains only free symbols and we have already seen more than two blocks worth of free symbols then deallocate -- 2.39.5