# HG changeset patch # User Gerd Moellmann # Date 962627321 0 # Node ID d9c85e2f07babb9e58b92d840217c86be34699c7 # Parent f39010aa1be654cb4673c72104d69747d8435908 (sweep_weak_table): Mark only objects that are not marked already. diff -r f39010aa1be6 -r d9c85e2f07ba src/fns.c --- a/src/fns.c Mon Jul 03 09:18:48 2000 +0000 +++ b/src/fns.c Mon Jul 03 12:28:41 2000 +0000 @@ -4175,14 +4175,17 @@ int remove_p; int i = XFASTINT (idx); Lisp_Object next; - + int key_known_to_survive_p, value_known_to_survive_p; + + key_known_to_survive_p = survives_gc_p (HASH_KEY (h, i)); + value_known_to_survive_p = survives_gc_p (HASH_VALUE (h, i)); + if (EQ (h->weak, Qkey)) - remove_p = !survives_gc_p (HASH_KEY (h, i)); + remove_p = !key_known_to_survive_p; else if (EQ (h->weak, Qvalue)) - remove_p = !survives_gc_p (HASH_VALUE (h, i)); + remove_p = !value_known_to_survive_p; else if (EQ (h->weak, Qt)) - remove_p = (!survives_gc_p (HASH_KEY (h, i)) - || !survives_gc_p (HASH_VALUE (h, i))); + remove_p = !key_known_to_survive_p || !value_known_to_survive_p; else abort (); @@ -4214,9 +4217,17 @@ if (!remove_p) { /* Make sure key and value survive. */ - mark_object (&HASH_KEY (h, i)); - mark_object (&HASH_VALUE (h, i)); - marked = 1; + if (!key_known_to_survive_p) + { + mark_object (&HASH_KEY (h, i)); + marked = 1; + } + + if (!value_known_to_survive_p) + { + mark_object (&HASH_VALUE (h, i)); + marked = 1; + } } }