Rob Shearman : widl: Fix get_explicit_generic_handle_type and is_context_handle to detect attributes set on typedefs other than the first .

Alexandre Julliard julliard at winehq.org
Fri Mar 6 09:49:26 CST 2009


Module: wine
Branch: master
Commit: 0be9d2595dd10eed12ad97c836f14cb7278a045f
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=0be9d2595dd10eed12ad97c836f14cb7278a045f

Author: Rob Shearman <robertshearman at gmail.com>
Date:   Thu Mar  5 08:21:42 2009 +0000

widl: Fix get_explicit_generic_handle_type and is_context_handle to detect attributes set on typedefs other than the first.

Change get_explicit_handle_var to use accessors for the type structure.

---

 tools/widl/header.c |   12 +++++++++---
 tools/widl/header.h |    4 +++-
 2 files changed, 12 insertions(+), 4 deletions(-)

diff --git a/tools/widl/header.c b/tools/widl/header.c
index e1c76a0..410a857 100644
--- a/tools/widl/header.c
+++ b/tools/widl/header.c
@@ -548,8 +548,11 @@ const var_t* get_explicit_handle_var(const var_t *func)
         return NULL;
 
     LIST_FOR_EACH_ENTRY( var, type_get_function_args(func->type), const var_t, entry )
-        if (var->type->type == RPC_FC_BIND_PRIMITIVE)
+    {
+        const type_t *type = var->type;
+        if (type_get_type(type) == TYPE_BASIC && type_basic_get_fc(type) == RPC_FC_BIND_PRIMITIVE)
             return var;
+    }
 
     return NULL;
 }
@@ -557,8 +560,11 @@ const var_t* get_explicit_handle_var(const var_t *func)
 const type_t* get_explicit_generic_handle_type(const var_t* var)
 {
     const type_t *t;
-    for (t = var->type; is_ptr(t); t = type_pointer_get_ref(t))
-        if (t->type != RPC_FC_BIND_PRIMITIVE && is_attr(t->attrs, ATTR_HANDLE))
+    for (t = var->type;
+         is_ptr(t) || type_is_alias(t);
+         t = type_is_alias(t) ? type_alias_get_aliasee(t) : type_pointer_get_ref(t))
+        if ((type_get_type_detect_alias(t) != TYPE_BASIC || type_basic_get_fc(t) != RPC_FC_BIND_PRIMITIVE) &&
+            is_attr(t->attrs, ATTR_HANDLE))
             return t;
     return NULL;
 }
diff --git a/tools/widl/header.h b/tools/widl/header.h
index 0c0c0a4..d4b3b88 100644
--- a/tools/widl/header.h
+++ b/tools/widl/header.h
@@ -75,7 +75,9 @@ static inline int is_string_type(const attr_list_t *attrs, const type_t *type)
 static inline int is_context_handle(const type_t *type)
 {
     const type_t *t;
-    for (t = type; is_ptr(t); t = type_pointer_get_ref(t))
+    for (t = type;
+         is_ptr(t) || type_is_alias(t);
+         t = type_is_alias(t) ? type_alias_get_aliasee(t) : type_pointer_get_ref(t))
         if (is_attr(t->attrs, ATTR_CONTEXTHANDLE))
             return 1;
     return 0;




More information about the wine-cvs mailing list