mirror of
https://github.com/DarkPlacesEngine/gmqcc.git
synced 2025-03-22 02:31:28 +00:00
remove the ast tree earlier - saves over 3% peak memory usage
This commit is contained in:
parent
06cccbb646
commit
b2348e1de0
1 changed files with 13 additions and 5 deletions
18
parser.c
18
parser.c
|
@ -39,6 +39,8 @@ typedef struct parser_s {
|
|||
lex_file *lex;
|
||||
int tok;
|
||||
|
||||
bool ast_cleaned;
|
||||
|
||||
ast_expression **globals;
|
||||
ast_expression **fields;
|
||||
ast_function **functions;
|
||||
|
@ -6189,9 +6191,12 @@ bool parser_compile_string(parser_t *parser, const char *name, const char *str,
|
|||
return parser_compile(parser);
|
||||
}
|
||||
|
||||
void parser_cleanup(parser_t *parser)
|
||||
static void parser_remove_ast(parser_t *parser)
|
||||
{
|
||||
size_t i;
|
||||
if (parser->ast_cleaned)
|
||||
return;
|
||||
parser->ast_cleaned = true;
|
||||
for (i = 0; i < vec_size(parser->accessors); ++i) {
|
||||
ast_delete(parser->accessors[i]->constval.vfunc);
|
||||
parser->accessors[i]->constval.vfunc = NULL;
|
||||
|
@ -6260,9 +6265,12 @@ void parser_cleanup(parser_t *parser)
|
|||
ast_value_delete(parser->const_vec[2]);
|
||||
|
||||
util_htdel(parser->aliases);
|
||||
|
||||
intrin_intrinsics_destroy(parser);
|
||||
}
|
||||
|
||||
void parser_cleanup(parser_t *parser)
|
||||
{
|
||||
parser_remove_ast(parser);
|
||||
code_cleanup(parser->code);
|
||||
|
||||
mem_d(parser);
|
||||
|
@ -6421,6 +6429,8 @@ bool parser_finish(parser_t *parser, const char *output)
|
|||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
generate_checksum(parser);
|
||||
if (OPTS_OPTION_BOOL(OPTION_DUMP))
|
||||
ir_builder_dump(ir, con_out);
|
||||
for (i = 0; i < vec_size(parser->functions); ++i) {
|
||||
|
@ -6430,6 +6440,7 @@ bool parser_finish(parser_t *parser, const char *output)
|
|||
return false;
|
||||
}
|
||||
}
|
||||
parser_remove_ast(parser);
|
||||
|
||||
if (compile_Werrors) {
|
||||
con_out("*** there were warnings treated as errors\n");
|
||||
|
@ -6441,15 +6452,12 @@ bool parser_finish(parser_t *parser, const char *output)
|
|||
if (OPTS_OPTION_BOOL(OPTION_DUMPFIN))
|
||||
ir_builder_dump(ir, con_out);
|
||||
|
||||
generate_checksum(parser);
|
||||
|
||||
if (!ir_builder_generate(parser->code, ir, output)) {
|
||||
con_out("*** failed to generate output file\n");
|
||||
ir_builder_delete(ir);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
ir_builder_delete(ir);
|
||||
return retval;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue