]> de.git.xonotic.org Git - xonotic/gmqcc.git/blobdiff - parser.c
don't deallocate the parser on a compile error -_-
[xonotic/gmqcc.git] / parser.c
index 1ee5cadf2cb030d47fb50ef8808c10ad34c57c0d..4b3ac5188bbc1c029cafe60aa363eee471fee150 100644 (file)
--- a/parser.c
+++ b/parser.c
@@ -517,12 +517,12 @@ static bool parser_sy_pop(parser_t *parser, shunt *sy)
 
         case opid1(','):
             if (blocks[0]) {
-                if (!ast_block_add_expr(blocks[0], exprs[1]))
+                if (!ast_block_exprs_add(blocks[0], exprs[1]))
                     return false;
             } else {
                 blocks[0] = ast_block_new(ctx);
-                if (!ast_block_add_expr(blocks[0], exprs[0]) ||
-                    !ast_block_add_expr(blocks[0], exprs[1]))
+                if (!ast_block_exprs_add(blocks[0], exprs[0]) ||
+                    !ast_block_exprs_add(blocks[0], exprs[1]))
                 {
                     return false;
                 }
@@ -900,7 +900,7 @@ static bool parser_close_call(parser_t *parser, shunt *sy)
         if (!params) {
             /* 1 param */
             paramcount = 1;
-            if (!ast_call_add_param(call, sy->out[sy->out_count].out)) {
+            if (!ast_call_params_add(call, sy->out[sy->out_count].out)) {
                 ast_delete(sy->out[sy->out_count].out);
                 parseerror(parser, "out of memory");
                 return false;
@@ -1698,7 +1698,7 @@ static ast_block* parser_parse_block(parser_t *parser)
         }
         if (!expr)
             continue;
-        if (!ast_block_add_expr(block, expr)) {
+        if (!ast_block_exprs_add(block, expr)) {
             ast_delete(expr);
             ast_block_delete(block);
             block = NULL;
@@ -1888,6 +1888,18 @@ static bool parser_variable(parser_t *parser, ast_block *localblock)
                 (void)!parser_t_locals_add(parser, vx);
                 (void)!parser_t_locals_add(parser, vy);
                 (void)!parser_t_locals_add(parser, vz);
+                if (!ast_block_locals_add(localblock, var) ||
+                    !ast_block_collect(localblock, vx.var) ||
+                    !ast_block_collect(localblock, vy.var) ||
+                    !ast_block_collect(localblock, vz.var))
+                {
+                    parser_pop_local(parser);
+                    parser_pop_local(parser);
+                    parser_pop_local(parser);
+                    parser_pop_local(parser);
+                    ast_value_delete(var);
+                    return false;
+                }
             }
         }
         else
@@ -1898,12 +1910,12 @@ static bool parser_variable(parser_t *parser, ast_block *localblock)
                 ast_value_delete(var);
                 return false;
             }
-        }
-        if (localblock && !ast_block_locals_add(localblock, var))
-        {
-            parser_pop_local(parser);
-            ast_value_delete(var);
-            return false;
+            if (localblock && !ast_block_locals_add(localblock, var))
+            {
+                parser_pop_local(parser);
+                ast_value_delete(var);
+                return false;
+            }
         }
 
         if (!parser_next(parser)) {
@@ -2222,7 +2234,6 @@ bool parser_compile(const char *filename)
                 else if (!parser->errors)
                     parseerror(parser, "parse error\n");
                 lex_close(parser->lex);
-                mem_d(parser);
                 return false;
             }
         }