diff options
Diffstat (limited to 'src/bootstrap/gc.c')
-rw-r--r-- | src/bootstrap/gc.c | 12 |
1 files changed, 7 insertions, 5 deletions
diff --git a/src/bootstrap/gc.c b/src/bootstrap/gc.c index a188279..358a07e 100644 --- a/src/bootstrap/gc.c +++ b/src/bootstrap/gc.c | |||
@@ -63,10 +63,12 @@ mark_environment(Environment *env) { | |||
63 | return; | 63 | return; |
64 | } | 64 | } |
65 | env->marked = true; | 65 | env->marked = true; |
66 | for (size_t i = 0; i < array_size(env->entries); i++) { | 66 | HashTablePair *pairs = env->table->pairs; |
67 | EnvEntry *entry = &env->entries[i]; | 67 | for (size_t i = 0; i < array_cap(pairs); i++) { |
68 | mark_obj(entry->symbol); | 68 | if (pairs[i].key != NULL) { |
69 | mark_obj(entry->value); | 69 | mark_obj(pairs[i].key); |
70 | mark_obj(pairs[i].value); | ||
71 | } | ||
70 | } | 72 | } |
71 | } | 73 | } |
72 | 74 | ||
@@ -120,7 +122,7 @@ mark_and_sweep(void) { | |||
120 | for (size_t i = 0; i < array_cap(gc.envs); i++) { | 122 | for (size_t i = 0; i < array_cap(gc.envs); i++) { |
121 | Environment *env = &gc.envs[i]; | 123 | Environment *env = &gc.envs[i]; |
122 | if (!env->marked) { | 124 | if (!env->marked) { |
123 | array_free(env->entries); | 125 | ht_free(env->table); |
124 | gc.free_envs.offsets[array_head(gc.free_envs.offsets)->size++] = i; | 126 | gc.free_envs.offsets[array_head(gc.free_envs.offsets)->size++] = i; |
125 | } | 127 | } |
126 | env->marked = false; | 128 | env->marked = false; |