aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBad Diode <bd@badd10de.dev>2021-11-10 18:27:23 +0100
committerBad Diode <bd@badd10de.dev>2021-11-10 18:27:23 +0100
commitdf4d884edb9b3a29d498d6852d0e8e077d9350df (patch)
tree23f8ddf294853972cc06f35ba028f7bdf958dbd2
parent3821eaa48ca56791cb5c9b85da70dde052d6c7ef (diff)
downloadbdl-df4d884edb9b3a29d498d6852d0e8e077d9350df.tar.gz
bdl-df4d884edb9b3a29d498d6852d0e8e077d9350df.zip
Fix bug on parameter detection for named functions
-rw-r--r--src/parser.c12
-rw-r--r--src/parser.h1
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) {
443 while (env != NULL) { 443 while (env != NULL) {
444 ssize_t idx = find_var_index(env->locals, symbol); 444 ssize_t idx = find_var_index(env->locals, symbol);
445 if (idx != -1) { 445 if (idx != -1) {
446 return env->locals[idx]; 446 return env->local_values[idx];
447 } 447 }
448 idx = find_var_index(env->params, symbol); 448 idx = find_var_index(env->params, symbol);
449 if (idx != -1) { 449 if (idx != -1) {
@@ -455,11 +455,12 @@ symbol_in_env(Environment *env, Object *symbol) {
455} 455}
456 456
457void 457void
458insert_local(Environment *env, Object *symbol) { 458insert_local(Environment *env, Object *symbol, Object *value) {
459 if (find_var_index(env->locals, symbol) != -1) { 459 if (find_var_index(env->locals, symbol) != -1) {
460 return; 460 return;
461 } 461 }
462 array_push(env->locals, symbol); 462 array_push(env->locals, symbol);
463 array_push(env->local_values, value);
463} 464}
464 465
465void 466void
@@ -491,7 +492,7 @@ semantic_analysis(Environment *env, Object *obj, Errors *errors) {
491 semantic_analysis(env, found, errors); 492 semantic_analysis(env, found, errors);
492 } break; 493 } break;
493 case OBJ_TYPE_DEF: { 494 case OBJ_TYPE_DEF: {
494 insert_local(env, obj->var_name); 495 insert_local(env, obj->var_name, obj->var_expr);
495 semantic_analysis(env, obj->var_expr, errors); 496 semantic_analysis(env, obj->var_expr, errors);
496 } break; 497 } break;
497 case OBJ_TYPE_SET: { 498 case OBJ_TYPE_SET: {
@@ -594,7 +595,7 @@ parse(Token *tokens, Errors *errors) {
594 symbol->text = (StringView){str, str_n}; 595 symbol->text = (StringView){str, str_n};
595 596
596 // Insert in global table. 597 // Insert in global table.
597 insert_local(global_env, symbol); 598 insert_local(global_env, symbol, symbol);
598 } 599 }
599 600
600 // Perform semantic analysis: 601 // Perform semantic analysis:
@@ -637,8 +638,10 @@ Environment *
637env_alloc(Environment *parent) { 638env_alloc(Environment *parent) {
638 Environment *env = malloc(sizeof(Environment)); 639 Environment *env = malloc(sizeof(Environment));
639 env->locals = NULL; 640 env->locals = NULL;
641 env->local_values = NULL;
640 env->params = NULL; 642 env->params = NULL;
641 array_init(env->locals, 0); 643 array_init(env->locals, 0);
644 array_init(env->local_values, 0);
642 array_init(env->params, 0); 645 array_init(env->params, 0);
643 env->parent = parent; 646 env->parent = parent;
644 array_push(environments, env); 647 array_push(environments, env);
@@ -680,6 +683,7 @@ free_objects(void) {
680 for (size_t i = 0; i < array_size(environments); i++) { 683 for (size_t i = 0; i < array_size(environments); i++) {
681 Environment *env = environments[i]; 684 Environment *env = environments[i];
682 array_free(env->locals); 685 array_free(env->locals);
686 array_free(env->local_values);
683 array_free(env->params); 687 array_free(env->params);
684 free(env); 688 free(env);
685 } 689 }
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 @@
5 5
6typedef struct Environment { 6typedef struct Environment {
7 struct Object **locals; 7 struct Object **locals;
8 struct Object **local_values;
8 struct Object **params; 9 struct Object **params;
9 struct Environment *parent; 10 struct Environment *parent;
10} Environment; 11} Environment;