Module: wine Branch: master Commit: 6b2ecb509abeb53ed552da14161c694afd9284ee URL: http://source.winehq.org/git/wine.git/?a=commit;h=6b2ecb509abeb53ed552da1416...
Author: Matteo Bruni mbruni@codeweavers.com Date: Fri Sep 28 17:22:39 2012 +0200
d3dcompiler: Parse struct dereferences.
---
dlls/d3dcompiler_43/hlsl.y | 31 ++++++++++++++++++++++++++++++- 1 files changed, 30 insertions(+), 1 deletions(-)
diff --git a/dlls/d3dcompiler_43/hlsl.y b/dlls/d3dcompiler_43/hlsl.y index d302fa1..e795962 100644 --- a/dlls/d3dcompiler_43/hlsl.y +++ b/dlls/d3dcompiler_43/hlsl.y @@ -1795,7 +1795,36 @@ postfix_expr: primary_expr struct source_location loc;
set_location(&loc, &@2); - if ($1->data_type->type <= HLSL_CLASS_LAST_NUMERIC) + if ($1->data_type->type == HLSL_CLASS_STRUCT) + { + struct hlsl_type *type = $1->data_type; + struct hlsl_struct_field *field; + + $$ = 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($1, field); + + if (!deref) + { + ERR("Out of memory\n"); + return -1; + } + deref->node.loc = loc; + $$ = &deref->node; + break; + } + } + if (!$$) + { + hlsl_report_message(loc.file, loc.line, loc.col, HLSL_LEVEL_ERROR, + "invalid subscript %s", debugstr_a($3)); + return 1; + } + } + else if ($1->data_type->type <= HLSL_CLASS_LAST_NUMERIC) { struct hlsl_ir_swizzle *swizzle;