From 16e22f9cb39a254bccd20613f7c2cfef75ae15a7 Mon Sep 17 00:00:00 2001 From: Nathan Ringo Date: Thu, 28 Nov 2024 20:13:45 -0600 Subject: Fixes GC bug. --- src/gc/sms.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'src/gc/sms.c') diff --git a/src/gc/sms.c b/src/gc/sms.c index 6261dc1..a2ab18e 100644 --- a/src/gc/sms.c +++ b/src/gc/sms.c @@ -95,7 +95,7 @@ static void gc_mark(const struct value initial_value) { // - A black object has its mark bit set, but is not pointed to by obj, nor is // it in the prev linked list. struct object *prev = NULL; - while (obj) { + for (;;) { // INVARIANT: obj points to a white object that we're about to make gray. // Since it's white, none of its fields should have the tag TAG_GC_INTERNAL, // so it shouldn't have a saved tag either. @@ -199,6 +199,7 @@ static void gc_sweep(void) { while ((header = *head)) { if ((*head)->mark) { (*head)->mark = false; + (*head)->saved_tag = 0; head = &header->next; } else { *head = header->next; -- cgit v1.2.3