aboutsummaryrefslogtreecommitdiffstats
path: root/src/bootstrap/environment.c
diff options
context:
space:
mode:
authorBad Diode <bd@badd10de.dev>2021-10-19 18:30:39 +0200
committerBad Diode <bd@badd10de.dev>2021-10-19 18:30:39 +0200
commit6ea02e2f75422d67548836670082daa8e8129102 (patch)
treea83fabfdd92bdbea209b5280b266e9eaa648afff /src/bootstrap/environment.c
parent008f173f9b9e52ae41683939614239059c0d3b04 (diff)
downloadbdl-6ea02e2f75422d67548836670082daa8e8129102.tar.gz
bdl-6ea02e2f75422d67548836670082daa8e8129102.zip
Change environments to use darray.h
Diffstat (limited to 'src/bootstrap/environment.c')
-rw-r--r--src/bootstrap/environment.c36
1 files changed, 14 insertions, 22 deletions
diff --git a/src/bootstrap/environment.c b/src/bootstrap/environment.c
index 3fe8be1..cb9e2f0 100644
--- a/src/bootstrap/environment.c
+++ b/src/bootstrap/environment.c
@@ -7,9 +7,8 @@ env_create(Environment *parent) {
7 Environment *env = alloc_env(); 7 Environment *env = alloc_env();
8 env->parent = parent; 8 env->parent = parent;
9 env->marked = false; 9 env->marked = false;
10 env->buf = NULL; 10 env->entries = NULL;
11 env->size = 0; 11 array_init(env->entries, ENV_BUF_CAP);
12 env->cap = ENV_BUF_CAP;
13 return env; 12 return env;
14} 13}
15 14
@@ -24,22 +23,15 @@ env_add_symbol(Environment *env, Object *symbol, Object *value) {
24 }); 23 });
25 return; 24 return;
26 } 25 }
27 if (env->buf == NULL) { 26 EnvEntry entry = (EnvEntry){symbol, value};
28 env->size = 0; 27 array_push(env->entries, entry);
29 env->cap = ENV_BUF_CAP;
30 env->buf = malloc(env->cap * sizeof(EnvEntry));
31 } else if (env->size == env->cap) {
32 env->cap *= 2;
33 env->buf = realloc(env->buf, env->cap * sizeof(EnvEntry));
34 }
35 env->buf[env->size++] = (EnvEntry){symbol, value};
36} 28}
37 29
38Object * 30Object *
39env_lookup(Environment *env, Object *symbol) { 31env_lookup(Environment *env, Object *symbol) {
40 while (env != NULL) { 32 while (env != NULL) {
41 for (size_t i = 0; i < env->size; i++) { 33 for (size_t i = 0; i < array_size(env->entries); i++) {
42 EnvEntry entry = env->buf[i]; 34 EnvEntry entry = env->entries[i];
43 if (obj_eq(symbol, entry.symbol)) { 35 if (obj_eq(symbol, entry.symbol)) {
44 return entry.value; 36 return entry.value;
45 } 37 }
@@ -52,10 +44,10 @@ env_lookup(Environment *env, Object *symbol) {
52Object * 44Object *
53env_update(Environment *env, Object *symbol, Object *value) { 45env_update(Environment *env, Object *symbol, Object *value) {
54 while (env != NULL) { 46 while (env != NULL) {
55 for (size_t i = 0; i < env->size; i++) { 47 for (size_t i = 0; i < array_size(env->entries); i++) {
56 EnvEntry entry = env->buf[i]; 48 EnvEntry entry = env->entries[i];
57 if (obj_eq(symbol, entry.symbol)) { 49 if (obj_eq(symbol, entry.symbol)) {
58 env->buf[i].value = value; 50 env->entries[i].value = value;
59 return obj_nil; 51 return obj_nil;
60 } 52 }
61 } 53 }
@@ -70,8 +62,8 @@ env_update(Environment *env, Object *symbol, Object *value) {
70 62
71ssize_t 63ssize_t
72env_index_current(Environment *env, Object *symbol) { 64env_index_current(Environment *env, Object *symbol) {
73 for (size_t i = 0; i < env->size; i++) { 65 for (size_t i = 0; i < array_size(env->entries); i++) {
74 EnvEntry entry = env->buf[i]; 66 EnvEntry entry = env->entries[i];
75 if (obj_eq(symbol, entry.symbol)) { 67 if (obj_eq(symbol, entry.symbol)) {
76 return i; 68 return i;
77 } 69 }
@@ -85,15 +77,15 @@ env_add_or_update_current(Environment *env, Object *symbol, Object *value) {
85 if (index == -1) { 77 if (index == -1) {
86 env_add_symbol(env, symbol, value); 78 env_add_symbol(env, symbol, value);
87 } else { 79 } else {
88 env->buf[index].value = value; 80 env->entries[index].value = value;
89 } 81 }
90} 82}
91 83
92Environment * 84Environment *
93env_extend(Environment *parent, Environment *extra) { 85env_extend(Environment *parent, Environment *extra) {
94 Environment *env = parent; 86 Environment *env = parent;
95 for (size_t i = 0; i < extra->size; i++) { 87 for (size_t i = 0; i < array_size(extra->entries); i++) {
96 EnvEntry entry = extra->buf[i]; 88 EnvEntry entry = extra->entries[i];
97 Environment *tmp = env; 89 Environment *tmp = env;
98 bool found = false; 90 bool found = false;
99 while (tmp != NULL) { 91 while (tmp != NULL) {