From ac0e96eefcdea2d4e61af557d629ff46db8da990 Mon Sep 17 00:00:00 2001 From: Gerd Moellmann Date: Mon, 7 Aug 2000 12:04:06 +0000 Subject: [PATCH] (sweep_weak_hash_tables): Fix the code taking unmarked tables out of the list of all weak hash tables. --- src/ChangeLog | 3 +++ src/fns.c | 27 ++++++++++++--------------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/src/ChangeLog b/src/ChangeLog index 2ced3a81004..46e0bddf112 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,5 +1,8 @@ 2000-08-07 Gerd Moellmann + * fns.c (sweep_weak_hash_tables): Fix the code taking unmarked + tables out of the list of all weak hash tables. + * xdisp.c (ensure_echo_area_buffers): If a buffer was killed, and a new buffer is created, make sure echo_area_buffer[] references the new buffer. diff --git a/src/fns.c b/src/fns.c index 51169efca73..1bd21d7783a 100644 --- a/src/fns.c +++ b/src/fns.c @@ -4380,8 +4380,8 @@ sweep_weak_table (h, remove_entries_p) void sweep_weak_hash_tables () { - Lisp_Object table; - struct Lisp_Hash_Table *h, *prev; + Lisp_Object table, used, next; + struct Lisp_Hash_Table *h; int marked; /* Mark all keys and values that are in use. Keep on marking until @@ -4403,27 +4403,24 @@ sweep_weak_hash_tables () while (marked); /* Remove tables and entries that aren't used. */ - prev = NULL; - for (table = Vweak_hash_tables; !GC_NILP (table); table = h->next_weak) + for (table = Vweak_hash_tables, used = Qnil; !GC_NILP (table); table = next) { - prev = h; h = XHASH_TABLE (table); - + next = h->next_weak; + if (h->size & ARRAY_MARK_FLAG) { + /* TABLE is marked as used. Sweep its contents. */ if (XFASTINT (h->count) > 0) sweep_weak_table (h, 1); - } - else - { - /* Table is not marked, and will thus be freed. - Take it out of the list of weak hash tables. */ - if (prev) - prev->next_weak = h->next_weak; - else - Vweak_hash_tables = h->next_weak; + + /* Add table to the list of used weak hash tables. */ + h->next_weak = used; + used = table; } } + + Vweak_hash_tables = used; } -- 2.39.2