Module: wine Branch: master Commit: c46fcfb356b31431cc34de1f9c6a7599db317abd URL: http://source.winehq.org/git/wine.git/?a=commit;h=c46fcfb356b31431cc34de1f9c...
Author: Rob Shearman rob@codeweavers.com Date: Sun Apr 20 22:15:29 2008 +0100
widl: Automatically add "handle_t IDL_handle" parameter to functions with no explicit handle specified whose containing interface has the explicit_handle attribute.
---
tools/widl/client.c | 20 -------------------- tools/widl/header.c | 14 ++++++++++++++ tools/widl/header.h | 1 + tools/widl/parser.y | 41 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 56 insertions(+), 20 deletions(-)
diff --git a/tools/widl/client.c b/tools/widl/client.c index b3f89a7..d15dfdc 100644 --- a/tools/widl/client.c +++ b/tools/widl/client.c @@ -70,25 +70,10 @@ static void check_pointers(const func_t *func) } }
-const var_t* get_context_handle_var(const func_t* func) -{ - const var_t* var; - - if (!func->args) - return NULL; - - LIST_FOR_EACH_ENTRY( var, func->args, const var_t, entry ) - if (is_attr(var->attrs, ATTR_IN) && is_context_handle(var->type)) - return var; - - return NULL; -} - static void write_function_stubs(type_t *iface, unsigned int *proc_offset) { const func_t *func; const char *implicit_handle = get_attrp(iface->attrs, ATTR_IMPLICIT_HANDLE); - int explicit_handle = is_attr(iface->attrs, ATTR_EXPLICIT_HANDLE); const var_t *var; int method_count = 0;
@@ -110,12 +95,7 @@ static void write_function_stubs(type_t *iface, unsigned int *proc_offset) { explicit_generic_handle_var = get_explicit_generic_handle_var(func); if (!explicit_generic_handle_var) - { context_handle_var = get_context_handle_var(func); - if (!context_handle_var && explicit_handle) - /* FIXME: should use automatically added IDL_handle parameter */ - error("explicit_handle attribute specified and %s() does not define an explicit binding handle - not implemented yet\n", def->name); - } }
write_type_decl_left(client, get_func_return_type(func)); diff --git a/tools/widl/header.c b/tools/widl/header.c index 8668ce9..3c89d61 100644 --- a/tools/widl/header.c +++ b/tools/widl/header.c @@ -618,6 +618,20 @@ const var_t* get_explicit_generic_handle_var(const func_t* func) return NULL; }
+const var_t* get_context_handle_var(const func_t* func) +{ + const var_t* var; + + if (!func->args) + return NULL; + + LIST_FOR_EACH_ENTRY( var, func->args, const var_t, entry ) + if (is_attr(var->attrs, ATTR_IN) && is_context_handle(var->type)) + return var; + + return NULL; +} + int has_out_arg_or_return(const func_t *func) { const var_t *var; diff --git a/tools/widl/header.h b/tools/widl/header.h index 3f4fee2..e8fdbc9 100644 --- a/tools/widl/header.h +++ b/tools/widl/header.h @@ -66,6 +66,7 @@ extern void write_generic_handle_routines(void); extern const var_t* get_explicit_handle_var(const func_t* func); extern const type_t* get_explicit_generic_handle_type(const var_t* var); extern const var_t* get_explicit_generic_handle_var(const func_t* func); +extern const var_t* get_context_handle_var(const func_t* func); extern int has_out_arg_or_return(const func_t *func); extern void write_guid(FILE *f, const char *guid_prefix, const char *name, const UUID *uuid); diff --git a/tools/widl/parser.y b/tools/widl/parser.y index 4d04546..6f5dbdd 100644 --- a/tools/widl/parser.y +++ b/tools/widl/parser.y @@ -142,6 +142,7 @@ static attr_list_t *check_dispiface_attrs(const char *name, attr_list_t *attrs); static const attr_list_t *check_module_attrs(const char *name, const attr_list_t *attrs); static const attr_list_t *check_coclass_attrs(const char *name, const attr_list_t *attrs); const char *get_attr_display_name(enum attr_type type); +static void add_explicit_handle_if_necessary(func_t *func);
#define tsENUM 1 #define tsSTRUCT 2 @@ -2482,8 +2483,48 @@ static void check_remoting_args(const func_t *func) } }
+static void add_explicit_handle_if_necessary(func_t *func) +{ + const var_t* explicit_handle_var; + const var_t* explicit_generic_handle_var = NULL; + const var_t* context_handle_var = NULL; + + /* check for a defined binding handle */ + explicit_handle_var = get_explicit_handle_var(func); + if (!explicit_handle_var) + { + explicit_generic_handle_var = get_explicit_generic_handle_var(func); + if (!explicit_generic_handle_var) + { + context_handle_var = get_context_handle_var(func); + if (!context_handle_var) + { + /* no explicit handle specified so add + * "[in] handle_t IDL_handle" as the first parameter to the + * function */ + var_t *idl_handle = make_var(xstrdup("IDL_handle")); + idl_handle->attrs = append_attr(NULL, make_attr(ATTR_IN)); + idl_handle->type = find_type("handle_t", 0); + if (!func->def->type->fields_or_args) + { + func->def->type->fields_or_args = xmalloc( sizeof(*func->def->type->fields_or_args) ); + list_init( func->def->type->fields_or_args ); + } + list_add_head( func->def->type->fields_or_args, &idl_handle->entry ); + func->args = func->def->type->fields_or_args; + } + } + } +} + static void check_functions(const type_t *iface) { + if (is_attr(iface->attrs, ATTR_EXPLICIT_HANDLE) && iface->funcs) + { + func_t *func; + LIST_FOR_EACH_ENTRY( func, iface->funcs, func_t, entry ) + add_explicit_handle_if_necessary(func); + } if (!is_inside_library && !is_attr(iface->attrs, ATTR_LOCAL)) { const func_t *func;