aboutsummaryrefslogtreecommitdiffstats
path: root/src/bootstrap/gc.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/bootstrap/gc.c')
-rw-r--r--src/bootstrap/gc.c12
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;