From 6ea02e2f75422d67548836670082daa8e8129102 Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Tue, 19 Oct 2021 18:30:39 +0200 Subject: Change environments to use darray.h --- src/bootstrap/environment.c | 36 ++++++++++++++---------------------- src/bootstrap/environment.h | 4 +--- src/bootstrap/gc.c | 11 +++-------- 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) { Environment *env = alloc_env(); env->parent = parent; env->marked = false; - env->buf = NULL; - env->size = 0; - env->cap = ENV_BUF_CAP; + env->entries = NULL; + array_init(env->entries, ENV_BUF_CAP); return env; } @@ -24,22 +23,15 @@ env_add_symbol(Environment *env, Object *symbol, Object *value) { }); return; } - if (env->buf == NULL) { - env->size = 0; - env->cap = ENV_BUF_CAP; - env->buf = malloc(env->cap * sizeof(EnvEntry)); - } else if (env->size == env->cap) { - env->cap *= 2; - env->buf = realloc(env->buf, env->cap * sizeof(EnvEntry)); - } - env->buf[env->size++] = (EnvEntry){symbol, value}; + EnvEntry entry = (EnvEntry){symbol, value}; + array_push(env->entries, entry); } Object * env_lookup(Environment *env, Object *symbol) { while (env != NULL) { - for (size_t i = 0; i < env->size; i++) { - EnvEntry entry = env->buf[i]; + for (size_t i = 0; i < array_size(env->entries); i++) { + EnvEntry entry = env->entries[i]; if (obj_eq(symbol, entry.symbol)) { return entry.value; } @@ -52,10 +44,10 @@ env_lookup(Environment *env, Object *symbol) { Object * env_update(Environment *env, Object *symbol, Object *value) { while (env != NULL) { - for (size_t i = 0; i < env->size; i++) { - EnvEntry entry = env->buf[i]; + for (size_t i = 0; i < array_size(env->entries); i++) { + EnvEntry entry = env->entries[i]; if (obj_eq(symbol, entry.symbol)) { - env->buf[i].value = value; + env->entries[i].value = value; return obj_nil; } } @@ -70,8 +62,8 @@ env_update(Environment *env, Object *symbol, Object *value) { ssize_t env_index_current(Environment *env, Object *symbol) { - for (size_t i = 0; i < env->size; i++) { - EnvEntry entry = env->buf[i]; + for (size_t i = 0; i < array_size(env->entries); i++) { + EnvEntry entry = env->entries[i]; if (obj_eq(symbol, entry.symbol)) { return i; } @@ -85,15 +77,15 @@ env_add_or_update_current(Environment *env, Object *symbol, Object *value) { if (index == -1) { env_add_symbol(env, symbol, value); } else { - env->buf[index].value = value; + env->entries[index].value = value; } } Environment * env_extend(Environment *parent, Environment *extra) { Environment *env = parent; - for (size_t i = 0; i < extra->size; i++) { - EnvEntry entry = extra->buf[i]; + for (size_t i = 0; i < array_size(extra->entries); i++) { + EnvEntry entry = extra->entries[i]; Environment *tmp = env; bool found = false; 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 { typedef struct Environment { struct Environment *parent; - EnvEntry *buf; - size_t size; - size_t cap; + EnvEntry *entries; bool marked; } Environment; 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) { return; } env->marked = true; - for (size_t i = 0; i < env->size; i++) { - EnvEntry *entry = &env->buf[i]; + for (size_t i = 0; i < array_size(env->entries); i++) { + EnvEntry *entry = &env->entries[i]; mark_obj(entry->symbol); mark_obj(entry->value); } @@ -132,12 +132,7 @@ mark_and_sweep(void) { for (size_t i = 0; i < array_cap(gc.envs); i++) { Environment *env = &gc.envs[i]; if (!env->marked) { - if (env->buf != NULL) { - free(env->buf); - env->buf = NULL; - env->size = 0; - env->cap = 0; - } + array_free(env->entries); gc.free_envs.buf[gc.free_envs.size++] = i; } 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) { void run_stdin(void) { size_t buf_size = 0; - size_t buf_cap = STDIN_BUF_CAP; - char *source = malloc(buf_cap * sizeof(char)); + char *source = NULL; + array_init(source, STDIN_BUF_CAP); char c; while ((c = getchar()) != EOF) { - if (buf_size == buf_cap) { - buf_cap *= 2; - source = realloc(source, buf_cap * sizeof(char)); - } - source[buf_size] = c; + array_push(source, c); buf_size++; } @@ -240,7 +236,7 @@ run_stdin(void) { errors_n = 0; } - free(source); + array_free(source); } #ifndef BIN_NAME -- cgit v1.2.1