Signed-off-by: Zebediah Figura zfigura@codeweavers.com --- This series is kind of an RFC, though, because I'm not actually sure we want to do this. The obvious benefit is that we get rid of a lot of common boilerplate that's otherwise pretty hard to sidestep—as shown by the diffstat in patch 3. On the other hand, we might want to do something like GCC's "x <aka y>", in which case this would be a step in the wrong direction (and a pretty impactful step at that.)
(This series also has us taking a bit more memory, but it's not a lot. We already allocate names for all numeric types, since they aren't keywords.)
libs/vkd3d-shader/hlsl.y | 9 +++++++-- libs/vkd3d-shader/hlsl_sm4.c | 3 +-- 2 files changed, 8 insertions(+), 4 deletions(-)
diff --git a/libs/vkd3d-shader/hlsl.y b/libs/vkd3d-shader/hlsl.y index 6f1794e79..585331062 100644 --- a/libs/vkd3d-shader/hlsl.y +++ b/libs/vkd3d-shader/hlsl.y @@ -2075,7 +2075,7 @@ struct_declaration:
if (!$3) { - if (!$2->name) + if (!strcmp($2->name, "<unnamed>")) hlsl_error(ctx, @2, VKD3D_SHADER_ERROR_HLSL_INVALID_SYNTAX, "Anonymous struct type must declare a variable."); if (modifiers) @@ -2116,7 +2116,12 @@ named_struct_spec: unnamed_struct_spec: KW_STRUCT '{' fields_list '}' { - $$ = hlsl_new_struct_type(ctx, NULL, $3); + char *name; + + if (!(name = hlsl_strdup(ctx, "<unnamed>"))) + YYABORT; + + $$ = hlsl_new_struct_type(ctx, name, $3); }
any_identifier: diff --git a/libs/vkd3d-shader/hlsl_sm4.c b/libs/vkd3d-shader/hlsl_sm4.c index 328a8ba1b..8c2bc8f84 100644 --- a/libs/vkd3d-shader/hlsl_sm4.c +++ b/libs/vkd3d-shader/hlsl_sm4.c @@ -329,7 +329,6 @@ static D3D_SHADER_VARIABLE_TYPE sm4_base_type(const struct hlsl_type *type) static void write_sm4_type(struct hlsl_ctx *ctx, struct vkd3d_bytecode_buffer *buffer, struct hlsl_type *type) { const struct hlsl_type *array_type = get_array_type(type); - const char *name = array_type->name ? array_type->name : "<unnamed>"; const struct hlsl_profile_info *profile = ctx->profile; unsigned int field_count = 0, array_size = 0; size_t fields_offset = 0, name_offset = 0; @@ -339,7 +338,7 @@ static void write_sm4_type(struct hlsl_ctx *ctx, struct vkd3d_bytecode_buffer *b return;
if (profile->major_version >= 5) - name_offset = put_string(buffer, name); + name_offset = put_string(buffer, array_type->name);
if (type->type == HLSL_CLASS_ARRAY) array_size = get_array_size(type);