From df4d884edb9b3a29d498d6852d0e8e077d9350df Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Wed, 10 Nov 2021 18:27:23 +0100 Subject: Fix bug on parameter detection for named functions --- src/parser.c | 12 ++++++++---- src/parser.h | 1 + 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/parser.c b/src/parser.c index 5bb7393..64bd22d 100644 --- a/src/parser.c +++ b/src/parser.c @@ -443,7 +443,7 @@ symbol_in_env(Environment *env, Object *symbol) { while (env != NULL) { ssize_t idx = find_var_index(env->locals, symbol); if (idx != -1) { - return env->locals[idx]; + return env->local_values[idx]; } idx = find_var_index(env->params, symbol); if (idx != -1) { @@ -455,11 +455,12 @@ symbol_in_env(Environment *env, Object *symbol) { } void -insert_local(Environment *env, Object *symbol) { +insert_local(Environment *env, Object *symbol, Object *value) { if (find_var_index(env->locals, symbol) != -1) { return; } array_push(env->locals, symbol); + array_push(env->local_values, value); } void @@ -491,7 +492,7 @@ semantic_analysis(Environment *env, Object *obj, Errors *errors) { semantic_analysis(env, found, errors); } break; case OBJ_TYPE_DEF: { - insert_local(env, obj->var_name); + insert_local(env, obj->var_name, obj->var_expr); semantic_analysis(env, obj->var_expr, errors); } break; case OBJ_TYPE_SET: { @@ -594,7 +595,7 @@ parse(Token *tokens, Errors *errors) { symbol->text = (StringView){str, str_n}; // Insert in global table. - insert_local(global_env, symbol); + insert_local(global_env, symbol, symbol); } // Perform semantic analysis: @@ -637,8 +638,10 @@ Environment * env_alloc(Environment *parent) { Environment *env = malloc(sizeof(Environment)); env->locals = NULL; + env->local_values = NULL; env->params = NULL; array_init(env->locals, 0); + array_init(env->local_values, 0); array_init(env->params, 0); env->parent = parent; array_push(environments, env); @@ -680,6 +683,7 @@ free_objects(void) { for (size_t i = 0; i < array_size(environments); i++) { Environment *env = environments[i]; array_free(env->locals); + array_free(env->local_values); array_free(env->params); free(env); } diff --git a/src/parser.h b/src/parser.h index 2c5cb61..ca7260b 100644 --- a/src/parser.h +++ b/src/parser.h @@ -5,6 +5,7 @@ typedef struct Environment { struct Object **locals; + struct Object **local_values; struct Object **params; struct Environment *parent; } Environment; -- cgit v1.2.1