[PATCH v2 vkd3d 1/4] vkd3d-shader: Handle preprocessor parsing errors.
Henri Verbeet
hverbeet at gmail.com
Fri Dec 11 12:11:42 CST 2020
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?
> +#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)
More information about the wine-devel
mailing list