From: Rémi Bernon rbernon@codeweavers.com
--- tools/widl/expr.c | 2 +- tools/widl/parser.y | 50 +++++++++++++++++++++++---------------------- tools/widl/widl.h | 2 +- 3 files changed, 28 insertions(+), 26 deletions(-)
diff --git a/tools/widl/expr.c b/tools/widl/expr.c index 4ee832f2ae5..37511727372 100644 --- a/tools/widl/expr.c +++ b/tools/widl/expr.c @@ -116,7 +116,7 @@ expr_t *expr_void(void) return e; }
-expr_t *make_exprl(enum expr_type type, int val) +expr_t *expr_int( enum expr_type type, int 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 4f9097aa957..9e8a0d88d1c 100644 --- a/tools/widl/parser.y +++ b/tools/widl/parser.y @@ -595,12 +595,13 @@ contract_ver: ;
contract_req - : decl_spec ',' contract_ver { if ($1->type->type_type != TYPE_APICONTRACT) - error_loc("type %s is not an apicontract\n", $1->type->name); - $$ = make_exprl(EXPR_NUM, $3); - $$ = make_exprt(EXPR_GTREQL, declare_var(NULL, $1, make_declarator(NULL), 0), $$); - } - ; + : decl_spec ',' contract_ver { + expr_t *contract = expr_int( EXPR_NUM, $contract_ver ); + if ($decl_spec->type->type_type != TYPE_APICONTRACT) + error_loc( "type %s is not an apicontract\n", $decl_spec->type->name ); + $$ = make_exprt( EXPR_GTREQL, declare_var( NULL, $decl_spec, make_declarator( NULL ), 0 ), contract ); + } + ;
static_attr : decl_spec ',' contract_req { if ($1->type->type_type != TYPE_INTERFACE) @@ -796,21 +797,22 @@ enums | enum_list ;
-enum_list: enum { if (!$1->eval) - $1->eval = make_exprl(EXPR_NUM, 0 /* default for first enum entry */); - $$ = append_var( NULL, $1 ); - } - | enum_list ',' enum { if (!$3->eval) +enum_list: enum { + if (!$enum->eval) $enum->eval = expr_int( EXPR_NUM, 0 /* default for first enum entry */ ); + $$ = append_var( NULL, $enum ); + } + | enum_list[list] ',' enum { + if (!$enum->eval) { - var_t *last = LIST_ENTRY( list_tail($$), var_t, entry ); - enum expr_type type = EXPR_NUM; - if (last->eval->type == EXPR_HEXNUM) type = EXPR_HEXNUM; - if (last->eval->cval + 1 < 0) type = EXPR_HEXNUM; - $3->eval = make_exprl(type, last->eval->cval + 1); + var_t *last = LIST_ENTRY( list_tail( $list ), var_t, entry ); + enum expr_type type = EXPR_NUM; + if (last->eval->type == EXPR_HEXNUM) type = EXPR_HEXNUM; + if (last->eval->cval + 1 < 0) type = EXPR_HEXNUM; + $enum->eval = expr_int( type, last->eval->cval + 1 ); } - $$ = append_var( $1, $3 ); - } - ; + $$ = append_var( $list, $enum ); + } + ;
enum_member: m_attributes ident { $$ = $2; $$->attrs = check_enum_member_attrs($1); @@ -838,12 +840,12 @@ m_expr | expr ;
-expr: aNUM { $$ = make_exprl(EXPR_NUM, $1); } - | aHEXNUM { $$ = make_exprl(EXPR_HEXNUM, $1); } +expr: aNUM { $$ = expr_int( EXPR_NUM, $aNUM ); } + | aHEXNUM { $$ = expr_int( EXPR_HEXNUM, $aHEXNUM ); } | aDOUBLE { $$ = expr_double( $aDOUBLE ); } - | tFALSE { $$ = make_exprl(EXPR_TRUEFALSE, 0); } - | tNULL { $$ = make_exprl(EXPR_NUM, 0); } - | tTRUE { $$ = make_exprl(EXPR_TRUEFALSE, 1); } + | tFALSE { $$ = expr_int( EXPR_TRUEFALSE, 0 ); } + | tNULL { $$ = expr_int( EXPR_NUM, 0 ); } + | tTRUE { $$ = expr_int( EXPR_TRUEFALSE, 1 ); } | aSTRING { $$ = expr_str( EXPR_STRLIT, $aSTRING ); } | aWSTRING { $$ = expr_str( EXPR_WSTRLIT, $aWSTRING ); } | aSQSTRING { $$ = expr_str( EXPR_CHARCONST, $aSQSTRING ); } diff --git a/tools/widl/widl.h b/tools/widl/widl.h index b747e17e10e..582e34fc43f 100644 --- a/tools/widl/widl.h +++ b/tools/widl/widl.h @@ -140,7 +140,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_int( enum expr_type type, int val ); extern expr_t *expr_double( double 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 );