main, parser: fix memory leak/unitialized mem
This commit is contained in:
@@ -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
|
||||
|
||||
13
src/main.c
13
src/main.c
@@ -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
|
||||
|
||||
21
src/parser.c
21
src/parser.c
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user