[PATCH v2 vkd3d 1/4] vkd3d-shader: Handle preprocessor parsing errors.
Zebediah Figura (she/her)
zfigura at codeweavers.com
Fri Dec 11 16:22:44 CST 2020
On 12/11/20 12:11 PM, Henri Verbeet wrote:
> On Fri, 11 Dec 2020 at 00:27, Zebediah Figura <zfigura at codeweavers.com> wrote:
>> +struct preproc_location
>> +{
>> + const char *filename;
>> + unsigned int first_line, first_column;
>> +};
>> +
>> struct preproc_ctx
>> {
>> void *scanner;
>>
>> + struct vkd3d_shader_message_context *message_context;
>> struct vkd3d_string_buffer buffer;
>> + unsigned int line, column;
>> + const char *source_name;
>> +
>> + bool error;
>> };
>>
> There seems to be some duplication of location information between
> struct vkd3d_shader_message_context, struct preproc_ctx, and struct
> preproc_location. Is that intentional? If it is, would it make sense
> to introduce e.g. a struct vkd3d_shader_source_location instead of
> struct preproc_location, and then use that structure in both struct
> vkd3d_shader_message_context and struct preproc_ctx?
Wrt the vkd3d_shader_message_context part—the current structure
definitely isn't a great fit for the preprocessor or HLSL parser (i.e.
the parts that use yacc) because the location tracking means that we'll
be setting a new location on every error call. (And of course most of
the other parsers we have don't really have a meaningful concept of
line/column locations...) But I wasn't sure enough to actually try to
redesign those parts, and it seemed like something that could be
deferred, so I just left it alone...
Wrt preproc_location vs preproc_ctx—part of the rub here is that {line,
column} is a bit different from {first_line, first_column}; i.e. if we
were to add {last_line, last_column}, that wouldn't be a part of
preproc_ctx.
>
>> +#define YYLLOC_DEFAULT(cur, rhs, n) \
>> + do \
>> + { \
>> + if (n) \
>> + { \
>> + (cur).filename = YYRHSLOC(rhs, 1).filename; \
>> + (cur).first_line = YYRHSLOC(rhs, 1).first_line; \
>> + (cur).first_column = YYRHSLOC(rhs, 1).first_column; \
>> + } \
>> + else \
>> + { \
>> + (cur).filename = YYRHSLOC(rhs, 0).filename; \
>> + (cur).first_line = YYRHSLOC(rhs, 0).first_line; \
>> + (cur).first_column = YYRHSLOC(rhs, 0).first_column; \
>> + } \
>> + } while (0)
>> +
> Generally speaking, we would try to avoid multi-line macros by doing
> something like the following where possible:
>
> static inline void preproc_yylloc_default(struct preproc_location
> *cur, const struct preproc_location *rhs, int n)
> {
> if (n)
> {
> cur->filename = YYRHSLOC(rhs, 1).filename;
> cur->first_line = YYRHSLOC(rhs, 1).first_line;
> cur->first_column = YYRHSLOC(rhs, 1).first_column;
> }
> else
> {
> cur->filename = YYRHSLOC(rhs, 0).filename;
> cur->first_line = YYRHSLOC(rhs, 0).first_line;
> cur->first_column = YYRHSLOC(rhs, 0).first_column;
> }
> }
>
> #define YYLLOC_DEFAULT(cur, rhs, n) preproc_yylloc_default(&cur, rhs, n)
>
> In this particular case though, I think all that essentially reduces to:
>
> #define YYLLOC_DEFAULT(cur, rhs, n) (cur) = YYRHSLOC(rhs, !!n)
>
Excellent point, thanks.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: OpenPGP_0x0D9D358A07A17840.asc
Type: application/pgp-keys
Size: 1769 bytes
Desc: not available
URL: <http://www.winehq.org/pipermail/wine-devel/attachments/20201211/49c577b2/attachment.key>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: OpenPGP_signature
Type: application/pgp-signature
Size: 495 bytes
Desc: OpenPGP digital signature
URL: <http://www.winehq.org/pipermail/wine-devel/attachments/20201211/49c577b2/attachment.sig>
More information about the wine-devel
mailing list