From ff5f9cbcb6e316438dabff976ae685f690262831 Mon Sep 17 00:00:00 2001 From: Francisco Casas Date: Thu, 10 Apr 2025 17:44:05 -0400 Subject: [PATCH] vkd3d-shader/hlsl: Add parse_variable_def destructors to the parser. --- libs/vkd3d-shader/hlsl.y | 29 +++++++++++++++++++---------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/libs/vkd3d-shader/hlsl.y b/libs/vkd3d-shader/hlsl.y index f38af1b26..6c5710aff 100644 --- a/libs/vkd3d-shader/hlsl.y +++ b/libs/vkd3d-shader/hlsl.y @@ -997,10 +997,24 @@ static void free_parse_variable_def(struct parse_variable_def *v) vkd3d_free(v->arrays.sizes); vkd3d_free(v->name); hlsl_cleanup_semantic(&v->semantic); - VKD3D_ASSERT(!v->state_blocks); + if (v->state_block_count) + { + for (unsigned int i = 0; i < v->state_block_count; ++i) + hlsl_free_state_block(v->state_blocks[i]); + vkd3d_free(v->state_blocks); + } vkd3d_free(v); } +static void destroy_parse_variable_defs(struct list *defs) +{ + struct parse_variable_def *v, *v_next; + + LIST_FOR_EACH_ENTRY_SAFE(v, v_next, defs, struct parse_variable_def, entry) + free_parse_variable_def(v); + vkd3d_free(defs); +} + static bool gen_struct_fields(struct hlsl_ctx *ctx, struct parse_fields *fields, struct hlsl_type *type, uint32_t modifiers, struct list *defs) { @@ -2618,11 +2632,7 @@ static struct hlsl_block *initialize_vars(struct hlsl_ctx *ctx, struct list *var if (!(initializers = make_empty_block(ctx))) { - LIST_FOR_EACH_ENTRY_SAFE(v, v_next, var_list, struct parse_variable_def, entry) - { - free_parse_variable_def(v); - } - vkd3d_free(var_list); + destroy_parse_variable_defs(var_list); return NULL; } @@ -6723,6 +6733,7 @@ static void validate_uav_type(struct hlsl_ctx *ctx, enum hlsl_sampler_dim dim, %type variables_def %type variables_def_typed %type switch_cases +%destructor { destroy_parse_variable_defs($$); } type_specs variables_def variables_def_typed; %token VAR_IDENTIFIER %token NEW_IDENTIFIER @@ -6835,6 +6846,7 @@ static void validate_uav_type(struct hlsl_ctx *ctx, enum hlsl_sampler_dim dim, %type variable_decl %type variable_def %type variable_def_typed +%destructor { free_parse_variable_def($$); } %% @@ -8161,15 +8173,12 @@ typedef_type: typedef: KW_TYPEDEF var_modifiers typedef_type type_specs ';' { - struct parse_variable_def *v, *v_next; uint32_t modifiers = $2; struct hlsl_type *type; if (!(type = apply_type_modifiers(ctx, $3, &modifiers, false, &@2))) { - LIST_FOR_EACH_ENTRY_SAFE(v, v_next, $4, struct parse_variable_def, entry) - free_parse_variable_def(v); - vkd3d_free($4); + destroy_parse_variable_defs($4); YYABORT; }