fix memleak; initialization boilerplate

This commit is contained in:
2025-01-01 23:09:50 +02:00
parent 85dfbe9d09
commit 49c910b8b2
4 changed files with 239 additions and 21 deletions

32
ast.c
View File

@@ -28,9 +28,8 @@ Ast astParse(const char* source, const uint32_t len) {
exit(1);
}
TokenizerToken token = tokenizerNext(&tok);
tokens.tags[tokens.len] = token.tag;
tokens.tags[++tokens.len] = token.tag;
tokens.starts[tokens.len] = token.loc.start;
tokens.len++;
if (token.tag == TOKEN_EOF)
break;
}
@@ -58,10 +57,19 @@ Ast astParse(const char* source, const uint32_t len) {
.scratch = SLICE_INIT(AstNodeIndex, N)
};
free(p.scratch.arr); // Parser takes ownership
parseRoot(&p);
p.nodes.cap = p.nodes.len = 0;
free(p.nodes.tags);
free(p.nodes.main_tokens);
free(p.nodes.datas);
p.extra_data.cap = p.extra_data.len = 0;
free(p.extra_data.arr);
p.scratch.cap = p.scratch.len = 0;
free(p.scratch.arr);
return (Ast) {
.source = source,
.source_len = len,
@@ -74,3 +82,19 @@ Ast astParse(const char* source, const uint32_t len) {
},
};
}
void astDeinit(Ast* tree) {
tree->tokens.cap = tree->tokens.len = 0;
free(tree->tokens.tags);
free(tree->tokens.starts);
tree->nodes.cap = 0;
tree->nodes.len = 0;
free(tree->nodes.tags);
free(tree->nodes.main_tokens);
free(tree->nodes.datas);
tree->extra_data.cap = 0;
tree->extra_data.len = 0;
free(tree->extra_data.arr);
}