summaryrefslogtreecommitdiffstats
path: root/hash.c
diff options
context:
space:
mode:
Diffstat (limited to 'hash.c')
-rw-r--r--hash.c13
1 files changed, 12 insertions, 1 deletions
diff --git a/hash.c b/hash.c
index 280d47ea..00d5764e 100644
--- a/hash.c
+++ b/hash.c
@@ -631,9 +631,20 @@ static void hash_mark(val hash)
}
break;
case hash_weak_or:
- case hash_weak_and:
/* mark nothing */
break;
+ case hash_weak_and:
+ /* Mark key if value is reachable and vice versa. */
+ for (i = 0; i < h->modulus; i++) {
+ for (iter = h->table->v.vec[i]; iter; iter = us_cdr(iter)) {
+ val entry = us_car(iter);
+ if (gc_is_reachable(us_car(entry)))
+ gc_mark(us_cdr(entry));
+ else if (gc_is_reachable(us_cdr(entry)))
+ gc_mark(us_car(entry));
+ }
+ }
+ break;
}
h->next = reachable_weak_hashes;