On 9/25/21 07:09, Matteo Bruni wrote:
On Thu, Sep 23, 2021 at 11:47 PM Zebediah Figura zfigura@codeweavers.com wrote:
Signed-off-by: Zebediah Figura zfigura@codeweavers.com
Makefile.am | 1 + libs/vkd3d-shader/hlsl.h | 2 + libs/vkd3d-shader/hlsl.y | 64 +++++++- tests/hlsl-state-block-syntax.shader_test | 173 ++++++++++++++++++++++ 4 files changed, 235 insertions(+), 5 deletions(-) create mode 100644 tests/hlsl-state-block-syntax.shader_test
diff --git a/libs/vkd3d-shader/hlsl.y b/libs/vkd3d-shader/hlsl.y index 19745e725..420156e66 100644 --- a/libs/vkd3d-shader/hlsl.y +++ b/libs/vkd3d-shader/hlsl.y
@@ -2878,6 +2909,29 @@ primary_expr: if (!($$ = add_call(ctx, $1, &$3, @1))) YYABORT; }
- | NEW_IDENTIFIER
{
if (ctx->in_state_block)
{
struct hlsl_ir_load *load;
struct hlsl_ir_var *var;
if (!(var = hlsl_new_var(ctx, $1, ctx->builtin_types.scalar[HLSL_TYPE_INT], @1, NULL, 0, NULL)))
YYABORT;
if (!(load = hlsl_new_var_load(ctx, var, @1)))
YYABORT;
if (!($$ = make_list(ctx, &load->node)))
{
hlsl_free_instr(&load->node);
YYABORT;
}
}
This leaks var on error. Actually, does it also leak it on success? We usually store the variables into scopes and go through the scopes when we want to free them, but that's not the case here.
Indeed; I think this should be hlsl_new_synthetic_var(). Not sure what I was doing here...