From d9c247f2ae732c86c2e0777146c826d1080412d7 Mon Sep 17 00:00:00 2001 From: Matteo Bruni Date: Wed, 19 Sep 2012 19:46:13 +0200 Subject: [PATCH] d3dcompiler: Parse "typedef" statement. --- dlls/d3dcompiler_43/d3dcompiler_private.h | 4 + dlls/d3dcompiler_43/hlsl.y | 97 +++++++++++++++++++++++ 2 files changed, 101 insertions(+) diff --git a/dlls/d3dcompiler_43/d3dcompiler_private.h b/dlls/d3dcompiler_43/d3dcompiler_private.h index fffb6c67411..b3a9586f69c 100644 --- a/dlls/d3dcompiler_43/d3dcompiler_private.h +++ b/dlls/d3dcompiler_43/d3dcompiler_private.h @@ -734,6 +734,10 @@ struct hlsl_ir_node #define HLSL_MODIFIER_IN 0x00000800 #define HLSL_MODIFIER_OUT 0x00001000 +#define HLSL_TYPE_MODIFIERS_MASK (HLSL_MODIFIER_PRECISE | HLSL_STORAGE_VOLATILE | \ + HLSL_MODIFIER_CONST | HLSL_MODIFIER_ROW_MAJOR | \ + HLSL_MODIFIER_COLUMN_MAJOR) + #define HLSL_MODIFIERS_COMPARISON_MASK (HLSL_MODIFIER_ROW_MAJOR | HLSL_MODIFIER_COLUMN_MAJOR) struct hlsl_ir_var diff --git a/dlls/d3dcompiler_43/hlsl.y b/dlls/d3dcompiler_43/hlsl.y index 486c9a8715b..e558f6fb175 100644 --- a/dlls/d3dcompiler_43/hlsl.y +++ b/dlls/d3dcompiler_43/hlsl.y @@ -175,6 +175,17 @@ static BOOL declare_variable(struct hlsl_ir_var *decl, BOOL local) static DWORD add_modifier(DWORD modifiers, DWORD mod, const struct YYLTYPE *loc); +static BOOL check_type_modifiers(DWORD modifiers, struct source_location *loc) +{ + if (modifiers & ~HLSL_TYPE_MODIFIERS_MASK) + { + hlsl_report_message(loc->file, loc->line, loc->col, HLSL_LEVEL_ERROR, + "modifier not allowed on typedefs"); + return FALSE; + } + return TRUE; +} + BOOL add_type_to_scope(struct hlsl_scope *scope, struct hlsl_type *def) { if (get_type(scope, def->name, FALSE)) @@ -354,6 +365,51 @@ static struct hlsl_ir_swizzle *get_swizzle(struct hlsl_ir_node *value, const cha return NULL; } +static BOOL add_typedef(DWORD modifiers, struct hlsl_type *orig_type, struct list *list, + struct source_location *loc) +{ + BOOL ret; + struct hlsl_type *type; + struct parse_variable_def *v, *v_next; + + if (!check_type_modifiers(modifiers, loc)) + { + LIST_FOR_EACH_ENTRY_SAFE(v, v_next, list, struct parse_variable_def, entry) + d3dcompiler_free(v); + d3dcompiler_free(list); + return FALSE; + } + + LIST_FOR_EACH_ENTRY_SAFE(v, v_next, list, struct parse_variable_def, entry) + { + if (v->array_size) + type = new_array_type(orig_type, v->array_size); + else + type = clone_hlsl_type(orig_type); + if (!type) + { + ERR("Out of memory\n"); + return FALSE; + } + d3dcompiler_free((void *)type->name); + type->name = v->name; + type->modifiers |= modifiers; + + if (type->type != HLSL_CLASS_MATRIX) + check_invalid_matrix_modifiers(type->modifiers, &v->loc); + + ret = add_type_to_scope(hlsl_ctx.cur_scope, type); + if (!ret) + { + hlsl_report_message(v->loc.file, v->loc.line, v->loc.col, HLSL_LEVEL_ERROR, + "redefinition of custom type '%s'", v->name); + } + d3dcompiler_free(v); + } + d3dcompiler_free(list); + return TRUE; +} + %} %locations @@ -487,6 +543,8 @@ static struct hlsl_ir_swizzle *get_swizzle(struct hlsl_ir_node *value, const cha %type base_type %type type %type declaration_statement +%type type_specs +%type type_spec %type complex_initializer %type initializer_expr_list %type initializer_expr @@ -802,6 +860,45 @@ declaration_statement: declaration $$ = d3dcompiler_alloc(sizeof(*$$)); list_init($$); } + | typedef + { + $$ = d3dcompiler_alloc(sizeof(*$$)); + if (!$$) + { + ERR("Out of memory\n"); + return -1; + } + list_init($$); + } + +typedef: KW_TYPEDEF var_modifiers type type_specs ';' + { + struct source_location loc; + + set_location(&loc, &@1); + if (!add_typedef($2, $3, $4, &loc)) + return 1; + } + +type_specs: type_spec + { + $$ = d3dcompiler_alloc(sizeof(*$$)); + list_init($$); + list_add_head($$, &$1->entry); + } + | type_specs ',' type_spec + { + $$ = $1; + list_add_tail($$, &$3->entry); + } + +type_spec: any_identifier array + { + $$ = d3dcompiler_alloc(sizeof(*$$)); + set_location(&$$->loc, &@1); + $$->name = $1; + $$->array_size = $2; + } declaration: var_modifiers type variables_def ';' {