From: Gerd Moellmann Date: Mon, 7 Aug 2000 12:04:06 +0000 (+0000) Subject: (sweep_weak_hash_tables): Fix the code taking unmarked X-Git-Tag: emacs-pretest-21.0.90~2458 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=ac0e96eefcdea2d4e61af557d629ff46db8da990;p=emacs.git (sweep_weak_hash_tables): Fix the code taking unmarked tables out of the list of all weak hash tables. --- 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; }