diff options
author | Bad Diode <bd@badd10de.dev> | 2021-10-19 18:30:39 +0200 |
---|---|---|
committer | Bad Diode <bd@badd10de.dev> | 2021-10-19 18:30:39 +0200 |
commit | 6ea02e2f75422d67548836670082daa8e8129102 (patch) | |
tree | a83fabfdd92bdbea209b5280b266e9eaa648afff | |
parent | 008f173f9b9e52ae41683939614239059c0d3b04 (diff) | |
download | bdl-6ea02e2f75422d67548836670082daa8e8129102.tar.gz bdl-6ea02e2f75422d67548836670082daa8e8129102.zip |
Change environments to use darray.h
-rw-r--r-- | src/bootstrap/environment.c | 36 | ||||
-rw-r--r-- | src/bootstrap/environment.h | 4 | ||||
-rw-r--r-- | src/bootstrap/gc.c | 11 | ||||
-rwxr-xr-x | src/bootstrap/main.c | 12 |
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 | ||
38 | Object * | 30 | Object * |
39 | env_lookup(Environment *env, Object *symbol) { | 31 | env_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) { | |||
52 | Object * | 44 | Object * |
53 | env_update(Environment *env, Object *symbol, Object *value) { | 45 | env_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 | ||
71 | ssize_t | 63 | ssize_t |
72 | env_index_current(Environment *env, Object *symbol) { | 64 | env_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 | ||
92 | Environment * | 84 | Environment * |
93 | env_extend(Environment *parent, Environment *extra) { | 85 | env_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 | ||
11 | typedef struct Environment { | 11 | typedef 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) { | |||
207 | void | 207 | void |
208 | run_stdin(void) { | 208 | run_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 |