[PATCH 6/7] d3dcompiler: Store the "record" field in struct hlsl_deref as a struct hlsl_deref pointer.
Zebediah Figura
z.figura12 at gmail.com
Fri Mar 6 17:17:35 CST 2020
Signed-off-by: Zebediah Figura <zfigura at codeweavers.com>
---
dlls/d3dcompiler_43/d3dcompiler_private.h | 3 +-
dlls/d3dcompiler_43/hlsl.y | 39 +++++++++++++++++++++--
dlls/d3dcompiler_43/utils.c | 33 +++++++++----------
3 files changed, 52 insertions(+), 23 deletions(-)
diff --git a/dlls/d3dcompiler_43/d3dcompiler_private.h b/dlls/d3dcompiler_43/d3dcompiler_private.h
index 830434c9ff1..d221d1056fa 100644
--- a/dlls/d3dcompiler_43/d3dcompiler_private.h
+++ b/dlls/d3dcompiler_43/d3dcompiler_private.h
@@ -912,7 +912,7 @@ struct hlsl_deref
} array;
struct
{
- struct hlsl_ir_node *record;
+ struct hlsl_deref *record;
struct hlsl_struct_field *field;
} record;
} v;
@@ -1147,7 +1147,6 @@ struct hlsl_ir_expr *new_cast(struct hlsl_ir_node *node, struct hlsl_type *type,
struct hlsl_ir_node *implicit_conversion(struct hlsl_ir_node *node, struct hlsl_type *type,
struct source_location *loc) DECLSPEC_HIDDEN;
struct hlsl_ir_deref *new_var_deref(struct hlsl_ir_var *var) DECLSPEC_HIDDEN;
-struct hlsl_ir_deref *new_record_deref(struct hlsl_ir_node *record, struct hlsl_struct_field *field) DECLSPEC_HIDDEN;
struct hlsl_ir_node *make_assignment(struct hlsl_ir_node *left, enum parse_assign_op assign_op,
struct hlsl_ir_node *right) DECLSPEC_HIDDEN;
void push_scope(struct hlsl_parse_ctx *ctx) DECLSPEC_HIDDEN;
diff --git a/dlls/d3dcompiler_43/hlsl.y b/dlls/d3dcompiler_43/hlsl.y
index a24d29e5df8..40159c60dcc 100644
--- a/dlls/d3dcompiler_43/hlsl.y
+++ b/dlls/d3dcompiler_43/hlsl.y
@@ -504,6 +504,31 @@ static struct hlsl_ir_jump *new_return(struct hlsl_ir_node *value, struct source
return jump;
}
+static struct hlsl_ir_deref *new_record_deref(struct hlsl_ir_deref *record, struct hlsl_struct_field *field)
+{
+ struct hlsl_ir_deref *deref = d3dcompiler_alloc(sizeof(*deref));
+
+ if (!deref)
+ {
+ ERR("Out of memory.\n");
+ return NULL;
+ }
+ deref->node.type = HLSL_IR_DEREF;
+ deref->node.data_type = field->type;
+ deref->src.type = HLSL_IR_DEREF_RECORD;
+ if (!(deref->src.v.record.record = d3dcompiler_alloc(sizeof(*deref->src.v.record.record))))
+ {
+ ERR("Out of memory.\n");
+ d3dcompiler_free(deref);
+ return NULL;
+ }
+ *deref->src.v.record.record = record->src;
+ list_remove(&record->node.entry);
+ d3dcompiler_free(record);
+ deref->src.v.record.field = field;
+ return deref;
+}
+
static void struct_var_initializer(struct list *list, struct hlsl_ir_var *var,
struct parse_initializer *initializer)
{
@@ -534,7 +559,7 @@ static void struct_var_initializer(struct list *list, struct hlsl_ir_var *var,
}
if (components_count_type(field->type) == components_count_type(node->data_type))
{
- deref = new_record_deref(&new_var_deref(var)->node, field);
+ deref = new_record_deref(new_var_deref(var), field);
if (!deref)
{
ERR("Out of memory.\n");
@@ -2025,19 +2050,27 @@ postfix_expr: primary_expr
{
struct hlsl_ir_node *node = node_from_list($1);
struct source_location loc;
-
loc = get_location(&@2);
if (node->data_type->type == HLSL_CLASS_STRUCT)
{
struct hlsl_type *type = node->data_type;
struct hlsl_struct_field *field;
+ struct hlsl_ir_deref *src;
+
+ if (node->type != HLSL_IR_DEREF)
+ {
+ FIXME("Unimplemented subscript of node type %s.\n",
+ debug_node_type(node->type));
+ YYABORT;
+ }
+ src = deref_from_node(node);
$$ = NULL;
LIST_FOR_EACH_ENTRY(field, type->e.elements, struct hlsl_struct_field, entry)
{
if (!strcmp($3, field->name))
{
- struct hlsl_ir_deref *deref = new_record_deref(node, field);
+ struct hlsl_ir_deref *deref = new_record_deref(src, field);
if (!deref)
{
diff --git a/dlls/d3dcompiler_43/utils.c b/dlls/d3dcompiler_43/utils.c
index 29b35c3d7eb..ded8d3d77e3 100644
--- a/dlls/d3dcompiler_43/utils.c
+++ b/dlls/d3dcompiler_43/utils.c
@@ -1385,23 +1385,6 @@ struct hlsl_ir_deref *new_var_deref(struct hlsl_ir_var *var)
return deref;
}
-struct hlsl_ir_deref *new_record_deref(struct hlsl_ir_node *record, struct hlsl_struct_field *field)
-{
- struct hlsl_ir_deref *deref = d3dcompiler_alloc(sizeof(*deref));
-
- if (!deref)
- {
- ERR("Out of memory.\n");
- return NULL;
- }
- deref->node.type = HLSL_IR_DEREF;
- deref->node.data_type = field->type;
- deref->src.type = HLSL_IR_DEREF_RECORD;
- deref->src.v.record.record = record;
- deref->src.v.record.field = field;
- return deref;
-}
-
static enum hlsl_ir_expr_op op_from_assignment(enum parse_assign_op op)
{
static const enum hlsl_ir_expr_op ops[] =
@@ -1881,7 +1864,7 @@ static void debug_dump_deref(const struct hlsl_deref *deref)
wine_dbg_printf("]");
break;
case HLSL_IR_DEREF_RECORD:
- debug_dump_src(deref->v.record.record);
+ debug_dump_deref(deref->v.record.record);
wine_dbg_printf(".%s", debugstr_a(deref->v.record.field->name));
break;
}
@@ -2232,8 +2215,22 @@ static void free_ir_constant(struct hlsl_ir_constant *constant)
d3dcompiler_free(constant);
}
+static void free_deref(struct hlsl_deref *deref)
+{
+ switch (deref->type)
+ {
+ case HLSL_IR_DEREF_RECORD:
+ free_deref(deref->v.record.record);
+ d3dcompiler_free(deref);
+ break;
+ default:
+ break;
+ }
+}
+
static void free_ir_deref(struct hlsl_ir_deref *deref)
{
+ free_deref(&deref->src);
d3dcompiler_free(deref);
}
--
2.25.1
More information about the wine-devel
mailing list