fix memleak; initialization boilerplate
This commit is contained in:
32
ast.c
32
ast.c
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user