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