vkd3d-shader/hlsl: Add parse_variable_def destructors to the parser.

This commit is contained in:
Francisco Casas
2025-04-10 17:44:05 -04:00
committed by Henri Verbeet
parent f3ba7a84f4
commit ff5f9cbcb6
Notes: Henri Verbeet 2025-04-16 16:52:17 +02:00
Approved-by: Elizabeth Figura (@zfigura)
Approved-by: Henri Verbeet (@hverbeet)
Merge-Request: https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/1460

View File

@@ -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 <list> variables_def
%type <list> variables_def_typed
%type <list> switch_cases
%destructor { destroy_parse_variable_defs($$); } type_specs variables_def variables_def_typed;
%token <name> VAR_IDENTIFIER
%token <name> NEW_IDENTIFIER
@@ -6835,6 +6846,7 @@ static void validate_uav_type(struct hlsl_ctx *ctx, enum hlsl_sampler_dim dim,
%type <variable_def> variable_decl
%type <variable_def> variable_def
%type <variable_def> variable_def_typed
%destructor { free_parse_variable_def($$); } <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;
}