]> git.eshelyaron.com Git - emacs.git/commitdiff
(sweep_weak_hash_tables): Fix the code taking unmarked
authorGerd Moellmann <gerd@gnu.org>
Mon, 7 Aug 2000 12:04:06 +0000 (12:04 +0000)
committerGerd Moellmann <gerd@gnu.org>
Mon, 7 Aug 2000 12:04:06 +0000 (12:04 +0000)
tables out of the list of all weak hash tables.

src/ChangeLog
src/fns.c

index 2ced3a810041fd758170511c6cdce6f6cc884880..46e0bddf1123fe86882a538d8a975615c9df90ea 100644 (file)
@@ -1,5 +1,8 @@
 2000-08-07  Gerd Moellmann  <gerd@gnu.org>
 
+       * 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.
index 51169efca73633c65aeda6964207c23054381cc0..1bd21d7783a870be24cb90cd707d7c24602e774f 100644 (file)
--- 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;
 }