]> git.xonotic.org Git - xonotic/gmqcc.git/blobdiff - parser.c
initialize ast_block->collect properly
[xonotic/gmqcc.git] / parser.c
index fc0cbd0eaa96ccf8b421d6191d97c11006452103..598202dcba7bf45699bfc34a53e13302d0bc445c 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_add(localblock, vx.var) ||
+                    !ast_block_collect_add(localblock, vy.var) ||
+                    !ast_block_collect_add(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)) {
@@ -2256,7 +2268,13 @@ void parser_cleanup()
         ast_delete(parser->globals[i].var);
         mem_d(parser->globals[i].name);
     }
+    MEM_VECTOR_CLEAR(parser, functions);
+    MEM_VECTOR_CLEAR(parser, imm_vector);
+    MEM_VECTOR_CLEAR(parser, imm_string);
+    MEM_VECTOR_CLEAR(parser, imm_float);
     MEM_VECTOR_CLEAR(parser, globals);
+    MEM_VECTOR_CLEAR(parser, fields);
+    MEM_VECTOR_CLEAR(parser, locals);
 
     mem_d(parser);
 }