Module: wine Branch: master Commit: a110cffd9541523372c45b428d0c418a55a37253 URL: http://source.winehq.org/git/wine.git/?a=commit;h=a110cffd9541523372c45b428d...
Author: Rob Shearman rob@codeweavers.com Date: Mon Mar 31 21:59:47 2008 +0100
widl: Parse typedefs of function pointers.
---
tools/widl/parser.y | 40 ++++++++++++++++++---------------------- tools/widl/widltypes.h | 2 ++ 2 files changed, 20 insertions(+), 22 deletions(-)
diff --git a/tools/widl/parser.y b/tools/widl/parser.y index a4f383f..7ddae74 100644 --- a/tools/widl/parser.y +++ b/tools/widl/parser.y @@ -100,7 +100,7 @@ static var_t *make_var(char *name); static pident_list_t *append_pident(pident_list_t *list, pident_t *p); static pident_t *make_pident(var_t *var); static func_list_t *append_func(func_list_t *list, func_t *func); -static func_t *make_func(var_t *def, var_list_t *args); +static func_t *make_func(var_t *def); static type_t *make_class(char *name); static type_t *make_safearray(type_t *type); static type_t *make_builtin(char *name); @@ -259,7 +259,7 @@ static void check_all_user_types(ifref_list_t *ifaces); %type <var> arg field s_field case enum constdef externdef %type <var_list> m_args no_args args fields cases enums enum_list dispint_props %type <var> m_ident t_ident ident -%type <pident> p_ident pident +%type <pident> pident func_ident direct_ident %type <pident_list> pident_list %type <func> funcdef %type <func_list> int_statements dispint_meths @@ -394,17 +394,6 @@ arg: attributes type pident array { $$ = $3->var; set_type($$, $1, $2->ptr_level, $3, TRUE); free($2); } - | attributes type pident '(' m_args ')' { $$ = $3->var; - $$->attrs = $1; - set_type($$, $2, $3->ptr_level - 1, NULL, TRUE); - free($3); - $$->args = $5; - } - | type pident '(' m_args ')' { $$ = $2->var; - set_type($$, $1, $2->ptr_level - 1, NULL, TRUE); - free($2); - $$->args = $4; - } ;
array: { $$ = NULL; } @@ -654,12 +643,11 @@ s_field: m_attributes type pident array { $$ = $3->var; ;
funcdef: - m_attributes type callconv pident - '(' m_args ')' { var_t *v = $4->var; + m_attributes type callconv pident { var_t *v = $4->var; v->attrs = $1; set_type(v, $2, $4->ptr_level, NULL, FALSE); free($4); - $$ = make_func(v, $6); + $$ = make_func(v); if (is_attr(v->attrs, ATTR_IN)) { error_loc("inapplicable attribute [in] for function '%s'\n",$$->def->name); } @@ -859,13 +847,19 @@ moduledef: modulehdr '{' int_statements '}' { $$ = $1; } ;
-p_ident: '*' pident %prec PPTR { $$ = $2; $$->ptr_level++; } - | tCONST p_ident { $$ = $2; /* FIXME */ } +pident: '*' pident %prec PPTR { $$ = $2; $$->ptr_level++; } + | tCONST pident { $$ = $2; /* FIXME */ } + | direct_ident ;
-pident: ident { $$ = make_pident($1); } - | p_ident +func_ident: direct_ident '(' m_args ')' { $$ = $1; $1->var->args = $3; } + +direct_ident: ident { $$ = make_pident($1); } | '(' pident ')' { $$ = $2; } + | func_ident { $$ = $1; + $$->func_ptr_level = $$->ptr_level; + $$->ptr_level = 0; + } ;
pident_list: @@ -1521,6 +1515,7 @@ static pident_t *make_pident(var_t *var) pident_t *p = xmalloc(sizeof(*p)); p->var = var; p->ptr_level = 0; + p->func_ptr_level = 0; return p; }
@@ -1536,11 +1531,12 @@ static func_list_t *append_func(func_list_t *list, func_t *func) return list; }
-static func_t *make_func(var_t *def, var_list_t *args) +static func_t *make_func(var_t *def) { func_t *f = xmalloc(sizeof(func_t)); f->def = def; - f->args = args; + f->args = def->args; + def->args = NULL; f->ignore = parse_only; f->idx = -1; return f; diff --git a/tools/widl/widltypes.h b/tools/widl/widltypes.h index 7eaacd1..7ddb449 100644 --- a/tools/widl/widltypes.h +++ b/tools/widl/widltypes.h @@ -244,6 +244,8 @@ struct _var_t { struct _pident_t { var_t *var; int ptr_level; + /* levels of indirection for function pointers */ + int func_ptr_level;
/* parser-internal */ struct list entry;