[PATCH vkd3d 1/6] vkd3d-shader/hlsl: Properly free parse_variable_def memory in declare_vars().

Giovanni Mascellani gmascellani at codeweavers.com
Wed Feb 16 02:47:08 CST 2022


Signed-off-by: Giovanni Mascellani <gmascellani at codeweavers.com>
---
I still think that a nearly 200 lines long function with relatively 
complicated execution flow and such a messy memory management is a bomb 
ready to go off, and that this patch proves my point.

Il 15/02/22 21:17, Francisco Casas ha scritto:
> Signed-off-by: Francisco Casas <fcasas at codeweavers.com>
> ---
>   libs/vkd3d-shader/hlsl.y | 12 ++++++++++++
>   1 file changed, 12 insertions(+)
> 
> diff --git a/libs/vkd3d-shader/hlsl.y b/libs/vkd3d-shader/hlsl.y
> index 459ad03b..4ec36b76 100644
> --- a/libs/vkd3d-shader/hlsl.y
> +++ b/libs/vkd3d-shader/hlsl.y
> @@ -1467,6 +1467,9 @@ static struct list *declare_vars(struct hlsl_ctx *ctx, struct hlsl_type *basic_t
>               hlsl_error(ctx, &v->loc, VKD3D_SHADER_ERROR_HLSL_MISSING_INITIALIZER,
>                       "Const variable \"%s\" is missing an initializer.", var->name);
>               hlsl_free_var(var);
> +            free_parse_initializer(&v->initializer);
> +            if (v->arrays.count)
> +                vkd3d_free(v->arrays.sizes);
>               vkd3d_free(v);
>               continue;
>           }
> @@ -1479,6 +1482,9 @@ static struct list *declare_vars(struct hlsl_ctx *ctx, struct hlsl_type *basic_t
>                       "Variable \"%s\" was already declared in this scope.", var->name);
>               hlsl_note(ctx, &old->loc, VKD3D_SHADER_LOG_ERROR, "\"%s\" was previously declared here.", old->name);
>               hlsl_free_var(var);
> +            free_parse_initializer(&v->initializer);
> +            if (v->arrays.count)
> +                vkd3d_free(v->arrays.sizes);
>               vkd3d_free(v);
>               continue;
>           }
> @@ -1521,6 +1527,8 @@ static struct list *declare_vars(struct hlsl_ctx *ctx, struct hlsl_type *basic_t
>               {
>                   FIXME("Initializers for non scalar/struct variables not supported yet.\n");
>                   free_parse_initializer(&v->initializer);
> +                if (v->arrays.count)
> +                    vkd3d_free(v->arrays.sizes);
>                   vkd3d_free(v);
>                   continue;
>               }
> @@ -1528,6 +1536,7 @@ static struct list *declare_vars(struct hlsl_ctx *ctx, struct hlsl_type *basic_t
>               {
>                   hlsl_fixme(ctx, &v->loc, "Array initializer.");
>                   free_parse_initializer(&v->initializer);
> +                vkd3d_free(v->arrays.sizes);
>                   vkd3d_free(v);
>                   continue;
>               }
> @@ -1550,6 +1559,9 @@ static struct list *declare_vars(struct hlsl_ctx *ctx, struct hlsl_type *basic_t
>                   list_move_tail(statements_list, v->initializer.instrs);
>               vkd3d_free(v->initializer.instrs);
>           }
> +
> +        if (v->arrays.count)
> +            vkd3d_free(v->arrays.sizes);
>           vkd3d_free(v);
>       }
>       vkd3d_free(var_list);



More information about the wine-devel mailing list