Mercurial > emacs
changeset 30634:d833a6450e10
(sweep_weak_hash_tables): Fix the code taking unmarked
tables out of the list of all weak hash tables.
author | Gerd Moellmann <gerd@gnu.org> |
---|---|
date | Mon, 07 Aug 2000 12:03:19 +0000 |
parents | 3ea6ae5c3939 |
children | 2c8dcfcbb642 |
files | src/fns.c |
diffstat | 1 files changed, 12 insertions(+), 15 deletions(-) [+] |
line wrap: on
line diff
--- a/src/fns.c Mon Aug 07 10:34:08 2000 +0000 +++ b/src/fns.c Mon Aug 07 12:03:19 2000 +0000 @@ -4380,8 +4380,8 @@ 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 @@ 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; }