From 2625019add3d16d3ee5d210bcebdd999d3b0cc32 Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Thu, 21 Oct 2021 18:23:18 +0200 Subject: Change environments to be a hash table --- src/bootstrap/environment.c | 59 +++++++++++---------------------------------- 1 file changed, 14 insertions(+), 45 deletions(-) (limited to 'src/bootstrap/environment.c') diff --git a/src/bootstrap/environment.c b/src/bootstrap/environment.c index cb9e2f0..dd4a648 100644 --- a/src/bootstrap/environment.c +++ b/src/bootstrap/environment.c @@ -7,8 +7,7 @@ env_create(Environment *parent) { Environment *env = alloc_env(); env->parent = parent; env->marked = false; - env->entries = NULL; - array_init(env->entries, ENV_BUF_CAP); + env->table = ht_init(); return env; } @@ -23,18 +22,15 @@ env_add_symbol(Environment *env, Object *symbol, Object *value) { }); return; } - EnvEntry entry = (EnvEntry){symbol, value}; - array_push(env->entries, entry); + ht_insert(env->table, symbol, value); } Object * env_lookup(Environment *env, Object *symbol) { while (env != NULL) { - 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; - } + Object *obj = ht_lookup(env->table, symbol); + if (obj != NULL) { + return obj; } env = env->parent; } @@ -44,12 +40,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 < array_size(env->entries); i++) { - EnvEntry entry = env->entries[i]; - if (obj_eq(symbol, entry.symbol)) { - env->entries[i].value = value; - return obj_nil; - } + Object *obj = ht_lookup(env->table, symbol); + if (obj != NULL) { + ht_insert(env->table, symbol, value); + return obj_nil; } env = env->parent; } @@ -60,43 +54,18 @@ env_update(Environment *env, Object *symbol, Object *value) { return obj_err; } -ssize_t -env_index_current(Environment *env, Object *symbol) { - for (size_t i = 0; i < array_size(env->entries); i++) { - EnvEntry entry = env->entries[i]; - if (obj_eq(symbol, entry.symbol)) { - return i; - } - } - return -1; -} - void env_add_or_update_current(Environment *env, Object *symbol, Object *value) { - ssize_t index = env_index_current(env, symbol); - if (index == -1) { - env_add_symbol(env, symbol, value); - } else { - env->entries[index].value = value; - } + ht_insert(env->table, symbol, value); } Environment * env_extend(Environment *parent, Environment *extra) { Environment *env = parent; - 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) { - if (env_index_current(tmp, entry.symbol) != -1) { - found = true; - break; - } - tmp = tmp->parent; - } - if (!found) { - env_add_symbol(env, entry.symbol, entry.value); + HashTablePair *pairs = extra->table->pairs; + for (size_t i = 0; i < array_cap(pairs); i++) { + if (pairs[i].key != NULL) { + ht_insert(env->table, pairs[i].key, pairs[i].value); } } return env; -- cgit v1.2.1