[PATCH 7/7] d3dcompiler: Store the "array" field in struct hlsl_deref as a struct hlsl_deref pointer.

Zebediah Figura z.figura12 at gmail.com
Fri Mar 6 17:17:36 CST 2020


Signed-off-by: Zebediah Figura <zfigura at codeweavers.com>
---
 dlls/d3dcompiler_43/d3dcompiler_private.h |  2 +-
 dlls/d3dcompiler_43/hlsl.y                | 25 ++++++++++++++++++++---
 dlls/d3dcompiler_43/utils.c               |  6 +++++-
 3 files changed, 28 insertions(+), 5 deletions(-)

diff --git a/dlls/d3dcompiler_43/d3dcompiler_private.h b/dlls/d3dcompiler_43/d3dcompiler_private.h
index d221d1056fa..f4f68b9e4cf 100644
--- a/dlls/d3dcompiler_43/d3dcompiler_private.h
+++ b/dlls/d3dcompiler_43/d3dcompiler_private.h
@@ -907,7 +907,7 @@ struct hlsl_deref
         struct hlsl_ir_var *var;
         struct
         {
-            struct hlsl_ir_node *array;
+            struct hlsl_deref *array;
             struct hlsl_ir_node *index;
         } array;
         struct
diff --git a/dlls/d3dcompiler_43/hlsl.y b/dlls/d3dcompiler_43/hlsl.y
index 40159c60dcc..11dd8026c16 100644
--- a/dlls/d3dcompiler_43/hlsl.y
+++ b/dlls/d3dcompiler_43/hlsl.y
@@ -2114,8 +2114,17 @@ postfix_expr:             primary_expr
                                 /* This may be an array dereference or a vector/matrix
                                  * subcomponent access.
                                  * We store it as an array dereference in any case. */
-                                struct hlsl_ir_deref *deref = d3dcompiler_alloc(sizeof(*deref));
-                                struct hlsl_type *expr_type = node_from_list($1)->data_type;
+                                struct hlsl_ir_deref *deref = d3dcompiler_alloc(sizeof(*deref)), *src;
+                                struct hlsl_ir_node *node = node_from_list($1);
+                                struct hlsl_type *expr_type = node->data_type;
+
+                                if (node->type != HLSL_IR_DEREF)
+                                {
+                                    FIXME("Unimplemented index of node type %s.\n",
+                                            debug_node_type(node->type));
+                                    YYABORT;
+                                }
+                                src = deref_from_node(node);
 
                                 TRACE("Array dereference from type %s\n", debug_hlsl_type(expr_type));
                                 if (!deref)
@@ -2157,7 +2166,17 @@ postfix_expr:             primary_expr
                                     YYABORT;
                                 }
                                 deref->src.type = HLSL_IR_DEREF_ARRAY;
-                                deref->src.v.array.array = node_from_list($1);
+                                if (!(deref->src.v.array.array = d3dcompiler_alloc(sizeof(*deref->src.v.array.array))))
+                                {
+                                    ERR("Out of memory.\n");
+                                    d3dcompiler_free(deref);
+                                    free_instr_list($1);
+                                    free_instr_list($3);
+                                    YYABORT;
+                                }
+                                *deref->src.v.array.array = src->src;
+                                list_remove(&src->node.entry);
+                                d3dcompiler_free(src);
                                 deref->src.v.array.index = node_from_list($3);
 
                                 $$ = append_binop($1, $3, &deref->node);
diff --git a/dlls/d3dcompiler_43/utils.c b/dlls/d3dcompiler_43/utils.c
index ded8d3d77e3..9ee392967ce 100644
--- a/dlls/d3dcompiler_43/utils.c
+++ b/dlls/d3dcompiler_43/utils.c
@@ -1858,7 +1858,7 @@ static void debug_dump_deref(const struct hlsl_deref *deref)
             wine_dbg_printf(")");
             break;
         case HLSL_IR_DEREF_ARRAY:
-            debug_dump_src(deref->v.array.array);
+            debug_dump_deref(deref->v.array.array);
             wine_dbg_printf("[");
             debug_dump_src(deref->v.array.index);
             wine_dbg_printf("]");
@@ -2223,6 +2223,10 @@ static void free_deref(struct hlsl_deref *deref)
             free_deref(deref->v.record.record);
             d3dcompiler_free(deref);
             break;
+        case HLSL_IR_DEREF_ARRAY:
+            free_deref(deref->v.array.array);
+            d3dcompiler_free(deref);
+            break;
         default:
             break;
     }
-- 
2.25.1




More information about the wine-devel mailing list