diff options
author | A404M <ahmadmahmoudiprogrammer@gmail.com> | 2025-01-28 01:51:43 +0330 |
---|---|---|
committer | A404M <ahmadmahmoudiprogrammer@gmail.com> | 2025-01-28 01:52:37 +0330 |
commit | aa69d90b4f0d8bb0d320c245ebf9b47741f655fe (patch) | |
tree | 9f198a8487e47c1c9ec0e977ec18ded5fd2c5a39 /src | |
parent | 12219a3af22fe4f17027dff43cfb459fef62eaa2 (diff) |
removed variable shadowing
Diffstat (limited to 'src')
-rw-r--r-- | src/compiler/ast-tree.c | 32 | ||||
-rw-r--r-- | src/compiler/ast-tree.h | 2 |
2 files changed, 28 insertions, 6 deletions
diff --git a/src/compiler/ast-tree.c b/src/compiler/ast-tree.c index 0ca3693..96f439d 100644 --- a/src/compiler/ast-tree.c +++ b/src/compiler/ast-tree.c @@ -272,7 +272,10 @@ AstTreeRoot *makeAstTree(ParserNode *parsedRoot) { variable->name_begin = node_metadata->name->str_begin; variable->name_end = node_metadata->name->str_end; - pushVariable(&root->variables, variable); + if (!pushVariable(&root->variables, variable)) { + astTreeVariableDelete(variable); + goto RETURN_ERROR; + } } for (size_t i = 0; i < nodes->size; ++i) { @@ -339,7 +342,19 @@ RETURN_ERROR: return NULL; } -void pushVariable(AstTreeVariables *variables, AstTreeVariable *variable) { +bool pushVariable(AstTreeVariables *variables, AstTreeVariable *variable) { + for (size_t j = 0; j < variables->size; ++j) { + char *var_begin = variables->data[j]->name_begin; + char *var_end = variables->data[j]->name_end; + + if (variable->name_end - variable->name_begin == var_end - var_begin && + strncmp(var_begin, variable->name_begin, + variable->name_end - variable->name_begin) == 0) { + printLog("Variable exists"); + return false; + } + } + size_t variables_size = a404m_malloc_usable_size(variables->data) / sizeof(*variables->data); if (variables_size == variables->size) { @@ -349,6 +364,7 @@ void pushVariable(AstTreeVariables *variables, AstTreeVariable *variable) { } variables->data[variables->size] = variable; variables->size += 1; + return true; } AstTreeVariable *getVariable(AstTreeVariables **variables, @@ -356,7 +372,7 @@ AstTreeVariable *getVariable(AstTreeVariables **variables, char *name_end) { for (size_t i = 0; i < variables_size; ++i) { AstTreeVariables vars = *variables[i]; - for (size_t j = vars.size - 1; j != (size_t)-1ULL; --j) { + for (size_t j = 0; j < vars.size; ++j) { char *var_begin = vars.data[j]->name_begin; char *var_end = vars.data[j]->name_end; @@ -457,7 +473,10 @@ AstTree *astTreeParseFunction(ParserNode *parserNode, argument->name_begin = arg_metadata->name->str_begin; argument->name_end = arg_metadata->name->str_end; - pushVariable(&function->arguments, argument); + if (!pushVariable(&function->arguments, argument)) { + astTreeVariableDelete(argument); + goto RETURN_ERROR; + } } for (size_t i = 0; i < body->size; ++i) { @@ -648,7 +667,10 @@ AstTree *astTreeParseConstant(ParserNode *parserNode, variable->name_begin = node_metadata->name->str_begin; variable->name_end = node_metadata->name->str_end; - pushVariable(variables[variables_size - 1], variable); + if (!pushVariable(variables[variables_size - 1], variable)) { + astTreeVariableDelete(variable); + goto RETURN_ERROR; + } return newAstTree(AST_TREE_TOKEN_VARIABLE_DEFINE, variable); RETURN_ERROR: diff --git a/src/compiler/ast-tree.h b/src/compiler/ast-tree.h index b5739ac..8dba559 100644 --- a/src/compiler/ast-tree.h +++ b/src/compiler/ast-tree.h @@ -86,7 +86,7 @@ AstTree *newAstTree(AstTreeToken token, void *metadata); AstTreeRoot *makeAstTree(ParserNode *parsedRoot); -void pushVariable(AstTreeVariables *variables, AstTreeVariable *variable); +bool pushVariable(AstTreeVariables *variables, AstTreeVariable *variable); AstTreeVariable *getVariable(AstTreeVariables **variables, size_t variables_size, char *name_begin, char *name_end); |