Rob Shearman : widl: Support the address-of operator in expressions.
Alexandre Julliard
julliard at winehq.org
Mon Dec 10 08:54:31 CST 2007
Module: wine
Branch: master
Commit: 72d9569cc43304e8b37c798e25e65706907d383b
URL: http://source.winehq.org/git/wine.git/?a=commit;h=72d9569cc43304e8b37c798e25e65706907d383b
Author: Rob Shearman <rob at codeweavers.com>
Date: Mon Dec 10 13:30:42 2007 +0000
widl: Support the address-of operator in expressions.
---
tools/widl/header.c | 4 ++++
tools/widl/parser.y | 4 ++++
tools/widl/typegen.c | 5 +++++
tools/widl/widltypes.h | 1 +
4 files changed, 14 insertions(+), 0 deletions(-)
diff --git a/tools/widl/header.c b/tools/widl/header.c
index 7d224fe..16bf82b 100644
--- a/tools/widl/header.c
+++ b/tools/widl/header.c
@@ -483,6 +483,10 @@ void write_expr(FILE *h, const expr_t *e, int brackets)
write_expr(h, e->ext2, 1);
if (brackets) fprintf(h, ")");
break;
+ case EXPR_ADDRESSOF:
+ fprintf(h, "&");
+ write_expr(h, e->ref, 1);
+ break;
}
}
diff --git a/tools/widl/parser.y b/tools/widl/parser.y
index 06f0035..ffeca26 100644
--- a/tools/widl/parser.y
+++ b/tools/widl/parser.y
@@ -280,6 +280,7 @@ static void check_all_user_types(ifref_list_t *ifaces);
%right CAST
%right PPTR
%right NEG
+%right ADDRESSOF
%%
@@ -612,6 +613,7 @@ expr: aNUM { $$ = make_exprl(EXPR_NUM, $1); }
| expr SHR expr { $$ = make_expr2(EXPR_SHR, $1, $3); }
| '~' expr { $$ = make_expr1(EXPR_NOT, $2); }
| '-' expr %prec NEG { $$ = make_expr1(EXPR_NEG, $2); }
+ | '&' expr %prec ADDRESSOF { $$ = make_expr1(EXPR_ADDRESSOF, $2); }
| '*' expr %prec PPTR { $$ = make_expr1(EXPR_PPTR, $2); }
| '(' type ')' expr %prec CAST { $$ = make_exprt(EXPR_CAST, $2, $4); }
| tSIZEOF '(' type ')' { $$ = make_exprt(EXPR_SIZEOF, $3, NULL); }
@@ -1138,6 +1140,8 @@ static expr_t *make_exprt(enum expr_type type, type_t *tref, expr_t *expr)
static expr_t *make_expr1(enum expr_type type, expr_t *expr)
{
expr_t *e;
+ if (type == EXPR_ADDRESSOF && expr->type != EXPR_IDENTIFIER)
+ error("address-of operator applied to invalid expression\n");
e = xmalloc(sizeof(expr_t));
e->type = type;
e->ref = expr;
diff --git a/tools/widl/typegen.c b/tools/widl/typegen.c
index 346318f..1988f36 100644
--- a/tools/widl/typegen.c
+++ b/tools/widl/typegen.c
@@ -288,6 +288,7 @@ static int compare_expr(const expr_t *a, const expr_t *b)
case EXPR_NOT:
case EXPR_NEG:
case EXPR_PPTR:
+ case EXPR_ADDRESSOF:
return compare_expr(a->ref, b->ref);
case EXPR_SIZEOF:
return compare_type(a->u.tref, b->u.tref);
@@ -3023,6 +3024,10 @@ static void write_struct_expr(FILE *h, const expr_t *e, int brackets,
write_struct_expr(h, e->ext2, 1, fields, structvar);
if (brackets) fprintf(h, ")");
break;
+ case EXPR_ADDRESSOF:
+ fprintf(h, "&");
+ write_struct_expr(h, e->ref, 1, fields, structvar);
+ break;
}
}
diff --git a/tools/widl/widltypes.h b/tools/widl/widltypes.h
index 4145be2..6930f71 100644
--- a/tools/widl/widltypes.h
+++ b/tools/widl/widltypes.h
@@ -154,6 +154,7 @@ enum expr_type
EXPR_OR,
EXPR_COND,
EXPR_TRUEFALSE,
+ EXPR_ADDRESSOF,
};
enum type_kind
More information about the wine-cvs
mailing list