aboutsummaryrefslogtreecommitdiffstats
path: root/src/bootstrap/environment.c
diff options
context:
space:
mode:
authorBad Diode <bd@badd10de.dev>2021-10-16 21:22:08 +0200
committerBad Diode <bd@badd10de.dev>2021-10-16 21:22:08 +0200
commitbb58afb57221eb0316d6ee14e19c5f4c4a822ba1 (patch)
treef7e35285282ad2341740a83834bdb521cd61a857 /src/bootstrap/environment.c
parent9a5fceac983db127de876c875a59307f8f2893ba (diff)
downloadbdl-bb58afb57221eb0316d6ee14e19c5f4c4a822ba1.tar.gz
bdl-bb58afb57221eb0316d6ee14e19c5f4c4a822ba1.zip
Add a working GC with mark-and-sweep
Diffstat (limited to 'src/bootstrap/environment.c')
-rw-r--r--src/bootstrap/environment.c13
1 files changed, 8 insertions, 5 deletions
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 {
8 EnvEntry *buf; 8 EnvEntry *buf;
9 size_t size; 9 size_t size;
10 size_t cap; 10 size_t cap;
11 bool marked;
11} Environment; 12} Environment;
12 13
13static Environment *global_env; 14static Environment *global_env;
14 15
15#define ENV_BUF_CAP 8 16#define ENV_BUF_CAP 8
16 17
18Environment *alloc_env(void);
19
17Environment * 20Environment *
18env_create(Environment *parent) { 21env_create(Environment *parent) {
19 Environment *env = malloc(sizeof(Environment)); 22 Environment *env = alloc_env();
20 env->parent = parent; 23 env->parent = parent;
21 env->buf = NULL; 24 env->buf = NULL;
22 env->size = 0; 25 env->size = 0;
@@ -66,7 +69,7 @@ env_update(Environment *env, Object *symbol, Object *value) {
66 for (size_t i = 0; i < env->size; i++) { 69 for (size_t i = 0; i < env->size; i++) {
67 EnvEntry entry = env->buf[i]; 70 EnvEntry entry = env->buf[i];
68 if (obj_eq(symbol, entry.symbol)) { 71 if (obj_eq(symbol, entry.symbol)) {
69 env->buf[i].value = obj_duplicate(value); 72 env->buf[i].value = value;
70 return obj_nil; 73 return obj_nil;
71 } 74 }
72 } 75 }
@@ -94,9 +97,9 @@ void
94env_add_or_update_current(Environment *env, Object *symbol, Object *value) { 97env_add_or_update_current(Environment *env, Object *symbol, Object *value) {
95 ssize_t index = env_index_current(env, symbol); 98 ssize_t index = env_index_current(env, symbol);
96 if (index == -1) { 99 if (index == -1) {
97 env_add_symbol(env, obj_duplicate(symbol), obj_duplicate(value)); 100 env_add_symbol(env, symbol, value);
98 } else { 101 } else {
99 env->buf[index].value = obj_duplicate(value); 102 env->buf[index].value = value;
100 } 103 }
101} 104}
102 105
@@ -115,7 +118,7 @@ env_extend(Environment *parent, Environment *extra) {
115 tmp = tmp->parent; 118 tmp = tmp->parent;
116 } 119 }
117 if (!found) { 120 if (!found) {
118 env_add_symbol(env, obj_duplicate(entry.symbol), obj_duplicate(entry.value)); 121 env_add_symbol(env, entry.symbol, entry.value);
119 } 122 }
120 } 123 }
121 return env; 124 return env;