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;
 }