diff options
Diffstat (limited to 'src/compiler')
-rw-r--r-- | src/compiler/ast-tree.c | 42 | ||||
-rw-r--r-- | src/compiler/ast-tree.h | 1 | ||||
-rw-r--r-- | src/compiler/code-generator.c | 14 |
3 files changed, 44 insertions, 13 deletions
diff --git a/src/compiler/ast-tree.c b/src/compiler/ast-tree.c index 8cbfaf5..2d129c2 100644 --- a/src/compiler/ast-tree.c +++ b/src/compiler/ast-tree.c @@ -123,30 +123,39 @@ void astTreeRootPrint(const AstTreeRoot *root) { void astTreeDestroy(AstTree tree) { switch (tree.token) { case AST_TREE_TOKEN_FUNCTION: { - AstTreeScope *metadata = tree.metadata; - for (size_t i = 0; i < metadata->expressions_size; ++i) { - astTreeDestroy(metadata->expressions[i]); + AstTreeFunction *metadata = tree.metadata; + for (size_t i = 0; i < metadata->scope.expressions_size; ++i) { + astTreeDestroy(metadata->scope.expressions[i]); + } + for (size_t i = 0; i < metadata->scope.variables_size; ++i) { + astTreeVariableDestroy(metadata->scope.variables[i]); + } + for (size_t i = 0; i < metadata->arguments_size; ++i) { + astTreeVariableDestroy(metadata->arguments[i]); } - free(metadata->expressions); + astTreeDelete(metadata->returnType); + free(metadata->scope.variables); + free(metadata->scope.expressions); + free(metadata->arguments); free(metadata); } return; case AST_TREE_TOKEN_KEYWORD_PRINT: case AST_TREE_TOKEN_TYPE_VOID: - case AST_TREE_TOKEN_IDENTIFIER: return; case AST_TREE_TOKEN_TYPE_FUNCTION: { AstTreeTypeFunction *metadata = tree.metadata; for (size_t i = 0; i < metadata->arguments_size; ++i) { astTreeDelete(metadata->arguments[i]); } + astTreeDelete(metadata->returnType); free(metadata->arguments); - free(metadata->returnType); free(metadata); } return; case AST_TREE_TOKEN_FUNCTION_CALL: { AstTreeFunctionCall *metadata = tree.metadata; + astTreeDelete(metadata->function); for (size_t i = 0; i < metadata->parameters_size; ++i) { astTreeDelete(metadata->parameters[i]); } @@ -154,13 +163,25 @@ void astTreeDestroy(AstTree tree) { free(metadata); } return; + case AST_TREE_TOKEN_IDENTIFIER: { + // AstTreeIdentifier *metadata = tree.metadata; // not needed + } + return; case AST_TREE_TOKEN_NONE: - break; } printLog("Bad token '%d'", tree.token); exit(1); } +void astTreeVariableDestroy(AstTreeVariable variable) { + if (variable.value != NULL) { + astTreeDelete(variable.value); + } + if (variable.type != NULL) { + astTreeDelete(variable.type); + } +} + void astTreeDelete(AstTree *tree) { astTreeDestroy(*tree); free(tree); @@ -168,7 +189,7 @@ void astTreeDelete(AstTree *tree) { void astTreeRootDelete(AstTreeRoot *root) { for (size_t i = 0; i < root->variables.size; ++i) { - astTreeDelete(root->variables.data[i]->value); + astTreeVariableDestroy(*root->variables.data[i]); free(root->variables.data[i]); } free(root->variables.data); @@ -446,10 +467,7 @@ AstTree *astTreeParseTypeFunction(ParserNode *parserNode, goto RETURN_ERROR; } - AstTree *tree = a404m_malloc(sizeof(*tree)); - tree->metadata = typeFunction; - tree->token = AST_TREE_TOKEN_TYPE_FUNCTION; - return tree; + return newAstTree(AST_TREE_TOKEN_TYPE_FUNCTION, typeFunction); RETURN_ERROR: return NULL; diff --git a/src/compiler/ast-tree.h b/src/compiler/ast-tree.h index ae97ca2..e92cb08 100644 --- a/src/compiler/ast-tree.h +++ b/src/compiler/ast-tree.h @@ -68,6 +68,7 @@ void astTreePrint(const AstTree *tree, int indent); void astTreeRootPrint(const AstTreeRoot *root); void astTreeDestroy(AstTree tree); +void astTreeVariableDestroy(AstTreeVariable variable); void astTreeDelete(AstTree *tree); void astTreeRootDelete(AstTreeRoot *root); diff --git a/src/compiler/code-generator.c b/src/compiler/code-generator.c index c07bab5..d9fc05d 100644 --- a/src/compiler/code-generator.c +++ b/src/compiler/code-generator.c @@ -9,7 +9,19 @@ void codeGeneratorDelete(CodeGeneratorCodes *code) { for (size_t i = 0; i < code->codes_size; ++i) { - continue; + CodeGeneratorCode current = code->codes[i]; + switch (current.instruction) { + case CODE_GENERATOR_INSTRUCTION_PRINT: + case CODE_GENERATOR_INSTRUCTION_RET: + continue; + case CODE_GENERATOR_INSTRUCTION_CALL: { + CodeGeneratorCall *metadata = current.metadata; + free(metadata); + } + continue; + } + printLog("Bad instruction %d", current.instruction); + exit(1); } free(code->codes); free(code); |