From: Rémi Bernon rbernon@codeweavers.com
--- tools/widl/expr.c | 2 +- tools/widl/parser.y | 24 +++++++++++++++++------- tools/widl/widl.h | 2 +- 3 files changed, 19 insertions(+), 9 deletions(-)
diff --git a/tools/widl/expr.c b/tools/widl/expr.c index 61d3c60405b..4ee832f2ae5 100644 --- a/tools/widl/expr.c +++ b/tools/widl/expr.c @@ -144,7 +144,7 @@ expr_t *expr_double( double val ) return e; }
-expr_t *make_exprs(enum expr_type type, char *val) +expr_t *expr_str( enum expr_type type, char *val ) { expr_t *e = xmalloc( sizeof(expr_t) ); memset( e, 0, sizeof(*e) ); diff --git a/tools/widl/parser.y b/tools/widl/parser.y index 5cca5491e89..4f9097aa957 100644 --- a/tools/widl/parser.y +++ b/tools/widl/parser.y @@ -632,7 +632,11 @@ composable_attr
deprecated_attr : aSTRING ',' aIDENTIFIER ',' contract_req - { $$ = make_expr3( EXPR_MEMBER, make_exprs( EXPR_STRLIT, $1 ), make_exprs( EXPR_IDENTIFIER, $3 ), $5 ); } + { + expr_t *message = expr_str( EXPR_STRLIT, $aSTRING ); + expr_t *action = expr_str( EXPR_IDENTIFIER, $aIDENTIFIER ); + $$ = make_expr3( EXPR_MEMBER, message, action, $contract_req ); + } ;
attribute @@ -840,10 +844,10 @@ expr: aNUM { $$ = make_exprl(EXPR_NUM, $1); } | tFALSE { $$ = make_exprl(EXPR_TRUEFALSE, 0); } | tNULL { $$ = make_exprl(EXPR_NUM, 0); } | tTRUE { $$ = make_exprl(EXPR_TRUEFALSE, 1); } - | aSTRING { $$ = make_exprs(EXPR_STRLIT, $1); } - | aWSTRING { $$ = make_exprs(EXPR_WSTRLIT, $1); } - | aSQSTRING { $$ = make_exprs(EXPR_CHARCONST, $1); } - | aIDENTIFIER { $$ = make_exprs(EXPR_IDENTIFIER, $1); } + | aSTRING { $$ = expr_str( EXPR_STRLIT, $aSTRING ); } + | aWSTRING { $$ = expr_str( EXPR_WSTRLIT, $aWSTRING ); } + | aSQSTRING { $$ = expr_str( EXPR_CHARCONST, $aSQSTRING ); } + | aIDENTIFIER { $$ = expr_str( EXPR_IDENTIFIER, $aIDENTIFIER ); } | expr '?' expr ':' expr { $$ = make_expr3(EXPR_COND, $1, $3, $5); } | expr LOGICALOR expr { $$ = make_expr2(EXPR_LOGOR, $1, $3); } | expr LOGICALAND expr { $$ = make_expr2(EXPR_LOGAND, $1, $3); } @@ -869,8 +873,14 @@ expr: aNUM { $$ = make_exprl(EXPR_NUM, $1); } | '-' expr %prec NEG { $$ = make_expr1(EXPR_NEG, $2); } | '&' expr %prec ADDRESSOF { $$ = make_expr1(EXPR_ADDRESSOF, $2); } | '*' expr %prec PPTR { $$ = make_expr1(EXPR_PPTR, $2); } - | expr MEMBERPTR aIDENTIFIER { $$ = make_expr2(EXPR_MEMBER, make_expr1(EXPR_PPTR, $1), make_exprs(EXPR_IDENTIFIER, $3)); } - | expr '.' aIDENTIFIER { $$ = make_expr2(EXPR_MEMBER, $1, make_exprs(EXPR_IDENTIFIER, $3)); } + | expr[obj] MEMBERPTR aIDENTIFIER { + expr_t *member = expr_str( EXPR_IDENTIFIER, $aIDENTIFIER ); + $$ = make_expr2( EXPR_MEMBER, make_expr1( EXPR_PPTR, $obj ), member ); + } + | expr[obj] '.' aIDENTIFIER { + expr_t *member = expr_str( EXPR_IDENTIFIER, $aIDENTIFIER ); + $$ = make_expr2( EXPR_MEMBER, $obj, member ); + } | '(' unqualified_decl_spec m_abstract_declarator ')' expr %prec CAST { $$ = make_exprt(EXPR_CAST, declare_var(NULL, $2, $3, 0), $5); free($2); free($3); } | tSIZEOF '(' unqualified_decl_spec m_abstract_declarator ')' diff --git a/tools/widl/widl.h b/tools/widl/widl.h index 97c2acc8923..b747e17e10e 100644 --- a/tools/widl/widl.h +++ b/tools/widl/widl.h @@ -142,7 +142,7 @@ struct expr_loc extern expr_t *expr_void(void); extern expr_t *make_exprl( enum expr_type type, int val ); extern expr_t *expr_double( double val ); -extern expr_t *make_exprs( enum expr_type type, char *val ); +extern expr_t *expr_str( enum expr_type type, char *val ); extern expr_t *make_exprt( enum expr_type type, var_t *var, expr_t *expr ); extern expr_t *make_expr1( enum expr_type type, expr_t *expr ); extern expr_t *make_expr2( enum expr_type type, expr_t *exp1, expr_t *exp2 );