forked from NeoFlock/noom
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
|
if needsRebuild(fname, out) then
|
||||||
needsLinking = true
|
needsLinking = true
|
||||||
runCommand('clang -c -o ' .. out .. ' ' .. fname .. ' ' .. table.concat(coolArgs, ' '))
|
runCommand('clang -c -g -o ' .. out .. ' ' .. fname .. ' ' .. table.concat(coolArgs, ' '))
|
||||||
end
|
end
|
||||||
|
|
||||||
objects[#objects+1] = out;
|
objects[#objects+1] = out;
|
||||||
@@ -82,5 +82,5 @@ end
|
|||||||
local exe = separator == '\\' and "noom.exe" or "noom"
|
local exe = separator == '\\' and "noom.exe" or "noom"
|
||||||
|
|
||||||
if needsLinking then
|
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
|
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) {
|
int main(int argc, char** argv) {
|
||||||
// uhh uhhh uhhhhh
|
// uhh uhhh uhhhhh
|
||||||
const char* code = "local t = {'a'; 2; 6}";
|
const char* code = "local t = {'a'; 2; 6}}";
|
||||||
noom_uint_t pos = 0;
|
noom_uint_t pos = 0;
|
||||||
|
|
||||||
printf("LEX OUTPUT:\n");
|
printf("LEX OUTPUT:\n");
|
||||||
@@ -54,16 +54,15 @@ int main(int argc, char** argv) {
|
|||||||
// time for parser testing
|
// time for parser testing
|
||||||
printf("\nPARSE OUTPUT:\n");
|
printf("\nPARSE OUTPUT:\n");
|
||||||
|
|
||||||
|
noomP_Parser parser;
|
||||||
noomP_Node *program;
|
noomP_Node *program;
|
||||||
noomP_Node *last_node;
|
|
||||||
|
|
||||||
int success = noomP_parse(code, "shitass", NOOM_VERSION_54, &program, &last_node);
|
int success = noomP_parse(code, "shitass", NOOM_VERSION_54, &program, &parser);
|
||||||
if (success != 0) return success;
|
if (success == 0)
|
||||||
|
print_node(program, 0);
|
||||||
print_node(program, 0);
|
|
||||||
|
|
||||||
// freeing time
|
// freeing time
|
||||||
|
noomP_Node *last_node = parser.last_node;
|
||||||
while (last_node) {
|
while (last_node) {
|
||||||
noomP_Node* next = last_node->previous_node;
|
noomP_Node* next = last_node->previous_node;
|
||||||
// subnodes could be null if we OOM'd during a realloc of it
|
// subnodes could be null if we OOM'd during a realloc of it
|
||||||
|
|||||||
19
src/parser.c
19
src/parser.c
@@ -127,8 +127,6 @@ noomP_Node* noomP_allocNode(noomP_Parser* parser) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
node->previous_node = parser->last_node;
|
|
||||||
|
|
||||||
node->subnodec = 0;
|
node->subnodec = 0;
|
||||||
node->subnodes = noom_alloc(sizeof(noomP_Node*) * 2);
|
node->subnodes = noom_alloc(sizeof(noomP_Node*) * 2);
|
||||||
node->subnode_cap = 2;
|
node->subnode_cap = 2;
|
||||||
@@ -138,6 +136,7 @@ noomP_Node* noomP_allocNode(noomP_Parser* parser) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
node->previous_node = parser->last_node;
|
||||||
parser->last_node = node;
|
parser->last_node = node;
|
||||||
|
|
||||||
return node;
|
return node;
|
||||||
@@ -1767,29 +1766,27 @@ noomP_Node* noomP_parseStatement(noomP_Parser* parser) {
|
|||||||
return stmt;
|
return stmt;
|
||||||
}
|
}
|
||||||
|
|
||||||
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) {
|
||||||
noomP_Parser parser;
|
noomP_initParser(parser, code, filename, version);
|
||||||
noomP_initParser(&parser, code, filename, version);
|
|
||||||
|
|
||||||
noomL_Token token;
|
noomL_Token token;
|
||||||
noomP_Node* node = noomP_allocNode(&parser);
|
noomP_Node* node = noomP_allocNode(parser);
|
||||||
if (node == 0) return -1;
|
if (node == 0) return -1;
|
||||||
|
|
||||||
node->source_offset = parser.lex_offset;
|
node->source_offset = parser->lex_offset;
|
||||||
node->type = NOOMP_NODE_PROGRAM;
|
node->type = NOOMP_NODE_PROGRAM;
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
if (noomP_peek(&parser, &token)) return 0;
|
if (noomP_peek(parser, &token)) return 0;
|
||||||
if (token.type == NOOML_TOKEN_EOF) break;
|
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 (child == 0) return -1;
|
||||||
|
|
||||||
if (noomP_addSubnode(&parser, node, child)) return 0;
|
if (noomP_addSubnode(parser, node, child)) return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
*outpointer = node;
|
*outpointer = node;
|
||||||
*last_node = parser.last_node;
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -117,7 +117,7 @@ noomP_Node* noomP_parseBlock(noomP_Parser* parser);
|
|||||||
noomP_Node* noomP_parseExpression(noomP_Parser* parser);
|
noomP_Node* noomP_parseExpression(noomP_Parser* parser);
|
||||||
noomP_Node* noomP_parseStatement(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);
|
int noomP_initParser(noomP_Parser* parser, const char* code, const char* filename, noom_LuaVersion version);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user