From bb58afb57221eb0316d6ee14e19c5f4c4a822ba1 Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Sat, 16 Oct 2021 21:22:08 +0200 Subject: Add a working GC with mark-and-sweep --- src/bootstrap/environment.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) (limited to 'src/bootstrap/environment.c') diff --git a/src/bootstrap/environment.c b/src/bootstrap/environment.c index 78f31fb..57baea6 100644 --- a/src/bootstrap/environment.c +++ b/src/bootstrap/environment.c @@ -8,15 +8,18 @@ typedef struct Environment { EnvEntry *buf; size_t size; size_t cap; + bool marked; } Environment; static Environment *global_env; #define ENV_BUF_CAP 8 +Environment *alloc_env(void); + Environment * env_create(Environment *parent) { - Environment *env = malloc(sizeof(Environment)); + Environment *env = alloc_env(); env->parent = parent; env->buf = NULL; env->size = 0; @@ -66,7 +69,7 @@ env_update(Environment *env, Object *symbol, Object *value) { for (size_t i = 0; i < env->size; i++) { EnvEntry entry = env->buf[i]; if (obj_eq(symbol, entry.symbol)) { - env->buf[i].value = obj_duplicate(value); + env->buf[i].value = value; return obj_nil; } } @@ -94,9 +97,9 @@ void env_add_or_update_current(Environment *env, Object *symbol, Object *value) { ssize_t index = env_index_current(env, symbol); if (index == -1) { - env_add_symbol(env, obj_duplicate(symbol), obj_duplicate(value)); + env_add_symbol(env, symbol, value); } else { - env->buf[index].value = obj_duplicate(value); + env->buf[index].value = value; } } @@ -115,7 +118,7 @@ env_extend(Environment *parent, Environment *extra) { tmp = tmp->parent; } if (!found) { - env_add_symbol(env, obj_duplicate(entry.symbol), obj_duplicate(entry.value)); + env_add_symbol(env, entry.symbol, entry.value); } } return env; -- cgit v1.2.1