diff options
author | Bad Diode <bd@badd10de.dev> | 2021-11-10 18:27:23 +0100 |
---|---|---|
committer | Bad Diode <bd@badd10de.dev> | 2021-11-10 18:27:23 +0100 |
commit | df4d884edb9b3a29d498d6852d0e8e077d9350df (patch) | |
tree | 23f8ddf294853972cc06f35ba028f7bdf958dbd2 /src/parser.c | |
parent | 3821eaa48ca56791cb5c9b85da70dde052d6c7ef (diff) | |
download | bdl-df4d884edb9b3a29d498d6852d0e8e077d9350df.tar.gz bdl-df4d884edb9b3a29d498d6852d0e8e077d9350df.zip |
Fix bug on parameter detection for named functions
Diffstat (limited to 'src/parser.c')
-rw-r--r-- | src/parser.c | 12 |
1 files changed, 8 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 | ||
457 | void | 457 | void |
458 | insert_local(Environment *env, Object *symbol) { | 458 | insert_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 | ||
465 | void | 466 | void |
@@ -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 * | |||
637 | env_alloc(Environment *parent) { | 638 | env_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 | } |