aboutsummaryrefslogtreecommitdiffstats
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
parent008f173f9b9e52ae41683939614239059c0d3b04 (diff)
downloadbdl-6ea02e2f75422d67548836670082daa8e8129102.tar.gz
bdl-6ea02e2f75422d67548836670082daa8e8129102.zip
Change environments to use darray.h
-rw-r--r--src/bootstrap/environment.c36
-rw-r--r--src/bootstrap/environment.h4
-rw-r--r--src/bootstrap/gc.c11
-rwxr-xr-xsrc/bootstrap/main.c12
4 files changed, 22 insertions, 41 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) {
diff --git a/src/bootstrap/environment.h b/src/bootstrap/environment.h
index cc13921..2d6a34e 100644
--- a/src/bootstrap/environment.h
+++ b/src/bootstrap/environment.h
@@ -10,9 +10,7 @@ typedef struct EnvEntry {
10 10
11typedef struct Environment { 11typedef struct Environment {
12 struct Environment *parent; 12 struct Environment *parent;
13 EnvEntry *buf; 13 EnvEntry *entries;
14 size_t size;
15 size_t cap;
16 bool marked; 14 bool marked;
17} Environment; 15} Environment;
18 16
diff --git a/src/bootstrap/gc.c b/src/bootstrap/gc.c
index 48499ac..d281536 100644
--- a/src/bootstrap/gc.c
+++ b/src/bootstrap/gc.c
@@ -75,8 +75,8 @@ mark_environment(Environment *env) {
75 return; 75 return;
76 } 76 }
77 env->marked = true; 77 env->marked = true;
78 for (size_t i = 0; i < env->size; i++) { 78 for (size_t i = 0; i < array_size(env->entries); i++) {
79 EnvEntry *entry = &env->buf[i]; 79 EnvEntry *entry = &env->entries[i];
80 mark_obj(entry->symbol); 80 mark_obj(entry->symbol);
81 mark_obj(entry->value); 81 mark_obj(entry->value);
82 } 82 }
@@ -132,12 +132,7 @@ mark_and_sweep(void) {
132 for (size_t i = 0; i < array_cap(gc.envs); i++) { 132 for (size_t i = 0; i < array_cap(gc.envs); i++) {
133 Environment *env = &gc.envs[i]; 133 Environment *env = &gc.envs[i];
134 if (!env->marked) { 134 if (!env->marked) {
135 if (env->buf != NULL) { 135 array_free(env->entries);
136 free(env->buf);
137 env->buf = NULL;
138 env->size = 0;
139 env->cap = 0;
140 }
141 gc.free_envs.buf[gc.free_envs.size++] = i; 136 gc.free_envs.buf[gc.free_envs.size++] = i;
142 } 137 }
143 env->marked = false; 138 env->marked = false;
diff --git a/src/bootstrap/main.c b/src/bootstrap/main.c
index c2c88d6..73a9244 100755
--- a/src/bootstrap/main.c
+++ b/src/bootstrap/main.c
@@ -207,16 +207,12 @@ run_file(char *file_name) {
207void 207void
208run_stdin(void) { 208run_stdin(void) {
209 size_t buf_size = 0; 209 size_t buf_size = 0;
210 size_t buf_cap = STDIN_BUF_CAP; 210 char *source = NULL;
211 char *source = malloc(buf_cap * sizeof(char)); 211 array_init(source, STDIN_BUF_CAP);
212 212
213 char c; 213 char c;
214 while ((c = getchar()) != EOF) { 214 while ((c = getchar()) != EOF) {
215 if (buf_size == buf_cap) { 215 array_push(source, c);
216 buf_cap *= 2;
217 source = realloc(source, buf_cap * sizeof(char));
218 }
219 source[buf_size] = c;
220 buf_size++; 216 buf_size++;
221 } 217 }
222 218
@@ -240,7 +236,7 @@ run_stdin(void) {
240 errors_n = 0; 236 errors_n = 0;
241 } 237 }
242 238
243 free(source); 239 array_free(source);
244} 240}
245 241
246#ifndef BIN_NAME 242#ifndef BIN_NAME