main, parser: fix memory leak/unitialized mem

This commit is contained in:
2026-05-23 20:28:56 +02:00
parent bb73054e2c
commit 9acff5f893
4 changed files with 18 additions and 22 deletions

View File

@@ -73,7 +73,7 @@ for i = 1,#files do
if needsRebuild(fname, out) then
needsLinking = true
runCommand('clang -c -o ' .. out .. ' ' .. fname .. ' ' .. table.concat(coolArgs, ' '))
runCommand('clang -c -g -o ' .. out .. ' ' .. fname .. ' ' .. table.concat(coolArgs, ' '))
end
objects[#objects+1] = out;
@@ -82,5 +82,5 @@ end
local exe = separator == '\\' and "noom.exe" or "noom"
if needsLinking then
runCommand('clang -o ' .. exe .. ' ' .. table.concat(objects, ' ') .. ' ' .. table.concat(coolArgs, ' '))
runCommand('clang -g -o ' .. exe .. ' ' .. table.concat(objects, ' ') .. ' ' .. table.concat(coolArgs, ' '))
end

View File

@@ -33,7 +33,7 @@ void print_node(noomP_Node* node, noom_uint_t depth) {
int main(int argc, char** argv) {
// uhh uhhh uhhhhh
const char* code = "local t = {'a'; 2; 6}";
const char* code = "local t = {'a'; 2; 6}}";
noom_uint_t pos = 0;
printf("LEX OUTPUT:\n");
@@ -54,16 +54,15 @@ int main(int argc, char** argv) {
// time for parser testing
printf("\nPARSE OUTPUT:\n");
noomP_Parser parser;
noomP_Node *program;
noomP_Node *last_node;
int success = noomP_parse(code, "shitass", NOOM_VERSION_54, &program, &last_node);
if (success != 0) return success;
print_node(program, 0);
int success = noomP_parse(code, "shitass", NOOM_VERSION_54, &program, &parser);
if (success == 0)
print_node(program, 0);
// freeing time
noomP_Node *last_node = parser.last_node;
while (last_node) {
noomP_Node* next = last_node->previous_node;
// subnodes could be null if we OOM'd during a realloc of it

View File

@@ -127,8 +127,6 @@ noomP_Node* noomP_allocNode(noomP_Parser* parser) {
return 0;
}
node->previous_node = parser->last_node;
node->subnodec = 0;
node->subnodes = noom_alloc(sizeof(noomP_Node*) * 2);
node->subnode_cap = 2;
@@ -137,7 +135,8 @@ noomP_Node* noomP_allocNode(noomP_Parser* parser) {
noom_free(node);
return 0;
}
node->previous_node = parser->last_node;
parser->last_node = node;
return node;
@@ -1767,29 +1766,27 @@ noomP_Node* noomP_parseStatement(noomP_Parser* parser) {
return stmt;
}
int noomP_parse(const char* code, const char* filename, noom_LuaVersion version, noomP_Node** outpointer, noomP_Node** last_node) {
noomP_Parser parser;
noomP_initParser(&parser, code, filename, version);
int noomP_parse(const char* code, const char* filename, noom_LuaVersion version, noomP_Node** outpointer, noomP_Parser* parser) {
noomP_initParser(parser, code, filename, version);
noomL_Token token;
noomP_Node* node = noomP_allocNode(&parser);
noomP_Node* node = noomP_allocNode(parser);
if (node == 0) return -1;
node->source_offset = parser.lex_offset;
node->source_offset = parser->lex_offset;
node->type = NOOMP_NODE_PROGRAM;
while (1) {
if (noomP_peek(&parser, &token)) return 0;
if (noomP_peek(parser, &token)) return 0;
if (token.type == NOOML_TOKEN_EOF) break;
noomP_Node* child = noomP_parseStatement(&parser);
noomP_Node* child = noomP_parseStatement(parser);
if (child == 0) return -1;
if (noomP_addSubnode(&parser, node, child)) return 0;
if (noomP_addSubnode(parser, node, child)) return 0;
}
*outpointer = node;
*last_node = parser.last_node;
return 0;
}

View File

@@ -117,7 +117,7 @@ noomP_Node* noomP_parseBlock(noomP_Parser* parser);
noomP_Node* noomP_parseExpression(noomP_Parser* parser);
noomP_Node* noomP_parseStatement(noomP_Parser* parser);
int noomP_parse(const char* code, const char* filename, noom_LuaVersion version, noomP_Node** outpointer, noomP_Node** last_node);
int noomP_parse(const char* code, const char* filename, noom_LuaVersion version, noomP_Node** outpointer, noomP_Parser* parser);
int noomP_initParser(noomP_Parser* parser, const char* code, const char* filename, noom_LuaVersion version);