diff options
Diffstat (limited to 'src/bootstrap/environment.c')
-rw-r--r-- | src/bootstrap/environment.c | 13 |
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 | ||
13 | static Environment *global_env; | 14 | static Environment *global_env; |
14 | 15 | ||
15 | #define ENV_BUF_CAP 8 | 16 | #define ENV_BUF_CAP 8 |
16 | 17 | ||
18 | Environment *alloc_env(void); | ||
19 | |||
17 | Environment * | 20 | Environment * |
18 | env_create(Environment *parent) { | 21 | env_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 | |||
94 | env_add_or_update_current(Environment *env, Object *symbol, Object *value) { | 97 | env_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; |