]> git.xonotic.org Git - xonotic/gmqcc.git/blobdiff - parser.c
set parser->lex to NULL after closing
[xonotic/gmqcc.git] / parser.c
index 24be6ec1dfe1a5a1c6a4e308d171d2393484582b..a084e2f05ca32130bdc6b70808cb7562225e7f88 100644 (file)
--- a/parser.c
+++ b/parser.c
@@ -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,13 +2234,14 @@ bool parser_compile(const char *filename)
                 else if (!parser->errors)
                     parseerror(parser, "parse error\n");
                 lex_close(parser->lex);
-                mem_d(parser);
+                parser->lex = NULL;
                 return false;
             }
         }
     }
 
     lex_close(parser->lex);
+    parser->lex = NULL;
 
     return !parser->errors;
 }