Zebediah Figura : widl: Introduce type_iface_get_async_iface().

Alexandre Julliard julliard at winehq.org
Thu Aug 15 14:50:46 CDT 2019


Module: wine
Branch: master
Commit: b4fe4ccc96403aa7af0eacf727fc007d4c27d52d
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=b4fe4ccc96403aa7af0eacf727fc007d4c27d52d

Author: Zebediah Figura <z.figura12 at gmail.com>
Date:   Wed Aug 14 21:45:46 2019 -0500

widl: Introduce type_iface_get_async_iface().

Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 tools/widl/header.c   |  6 +++---
 tools/widl/parser.y   |  2 +-
 tools/widl/proxy.c    | 12 ++++++------
 tools/widl/typegen.c  |  6 +++---
 tools/widl/typetree.h |  7 +++++++
 tools/widl/widl.c     |  6 +++---
 6 files changed, 23 insertions(+), 16 deletions(-)

diff --git a/tools/widl/header.c b/tools/widl/header.c
index a862a72..f4bf13a 100644
--- a/tools/widl/header.c
+++ b/tools/widl/header.c
@@ -1651,8 +1651,8 @@ static void write_forward_decls(FILE *header, const statement_list_t *stmts)
           if (is_object(iface) || is_attr(iface->attrs, ATTR_DISPINTERFACE))
           {
             write_forward(header, iface);
-            if (iface->details.iface->async_iface)
-              write_forward(header, iface->details.iface->async_iface);
+            if (type_iface_get_async_iface(iface))
+              write_forward(header, type_iface_get_async_iface(iface));
           }
         }
         else if (type_get_type(stmt->u.type) == TYPE_COCLASS)
@@ -1688,7 +1688,7 @@ static void write_header_stmts(FILE *header, const statement_list_t *stmts, cons
         if (type_get_type(stmt->u.type) == TYPE_INTERFACE)
         {
           type_t *iface = stmt->u.type;
-          type_t *async_iface = iface->details.iface->async_iface;
+          type_t *async_iface = type_iface_get_async_iface(iface);
           if (is_object(iface)) is_object_interface++;
           if (is_attr(stmt->u.type->attrs, ATTR_DISPINTERFACE) || is_object(stmt->u.type))
           {
diff --git a/tools/widl/parser.y b/tools/widl/parser.y
index daff825..e39d801 100644
--- a/tools/widl/parser.y
+++ b/tools/widl/parser.y
@@ -2809,7 +2809,7 @@ static void check_async_uuid(type_t *iface)
 
     inherit = iface->details.iface->inherit;
     if (inherit && strcmp(inherit->name, "IUnknown"))
-        inherit = inherit->details.iface->async_iface;
+        inherit = type_iface_get_async_iface(inherit);
     if (!inherit)
         error_loc("async_uuid applied to an interface with incompatible parent\n");
 
diff --git a/tools/widl/proxy.c b/tools/widl/proxy.c
index 466c462..22c045d 100644
--- a/tools/widl/proxy.c
+++ b/tools/widl/proxy.c
@@ -739,7 +739,7 @@ static void write_proxy(type_t *iface, unsigned int *proc_offset)
   print_proxy( "{\n");
   indent++;
   print_proxy( "%s_%s\n",
-               iface->details.iface->async_iface == iface ? "CStdAsyncStubBuffer" : "CStdStubBuffer",
+               type_iface_get_async_iface(iface) == iface ? "CStdAsyncStubBuffer" : "CStdStubBuffer",
                need_delegation_indirect(iface) ? "DELEGATING_METHODS" : "METHODS");
   indent--;
   print_proxy( "}\n");
@@ -840,8 +840,8 @@ static void write_proxy_stmts(const statement_list_t *stmts, unsigned int *proc_
       if (need_proxy(iface))
       {
         write_proxy(iface, proc_offset);
-        if (iface->details.iface->async_iface)
-          write_proxy(iface->details.iface->async_iface, proc_offset);
+        if (type_iface_get_async_iface(iface))
+          write_proxy(type_iface_get_async_iface(iface), proc_offset);
       }
     }
   }
@@ -870,9 +870,9 @@ static void build_iface_list( const statement_list_t *stmts, type_t **ifaces[],
             {
                 *ifaces = xrealloc( *ifaces, (*count + 1) * sizeof(**ifaces) );
                 (*ifaces)[(*count)++] = iface;
-                if (iface->details.iface->async_iface)
+                if (type_iface_get_async_iface(iface))
                 {
-                    iface = iface->details.iface->async_iface;
+                    iface = type_iface_get_async_iface(iface);
                     *ifaces = xrealloc( *ifaces, (*count + 1) * sizeof(**ifaces) );
                     (*ifaces)[(*count)++] = iface;
                 }
@@ -1012,7 +1012,7 @@ static void write_proxy_routines(const statement_list_t *stmts)
   table_version = get_stub_mode() == MODE_Oif ? 2 : 1;
   for (i = 0; i < count; i++)
   {
-      if (interfaces[i]->details.iface->async_iface != interfaces[i]) continue;
+      if (type_iface_get_async_iface(interfaces[i]) != interfaces[i]) continue;
       if (table_version != 6)
       {
           fprintf(proxy, "static const IID *_AsyncInterfaceTable[] =\n");
diff --git a/tools/widl/typegen.c b/tools/widl/typegen.c
index 86611ae..47d12f5 100644
--- a/tools/widl/typegen.c
+++ b/tools/widl/typegen.c
@@ -1394,7 +1394,7 @@ static void write_proc_func_header( FILE *file, int indent, const type_t *iface,
 
         if (is_attr( func->attrs, ATTR_NOTIFY )) ext_flags |= 0x08;  /* HasNotify */
         if (is_attr( func->attrs, ATTR_NOTIFYFLAG )) ext_flags |= 0x10;  /* HasNotify2 */
-        if (iface == iface->details.iface->async_iface) oi2_flags |= 0x20;
+        if (iface == type_iface_get_async_iface(iface)) oi2_flags |= 0x20;
 
         size = get_function_buffer_size( func, PASS_IN );
         print_file( file, indent, "NdrFcShort(0x%x),\t/* client buffer = %u */\n", size, size );
@@ -1493,8 +1493,8 @@ static void for_each_iface(const statement_list_t *stmts,
         iface = stmt->u.type;
         if (!pred(iface)) continue;
         proc(iface, file, indent, offset);
-        if (iface->details.iface->async_iface)
-            proc(iface->details.iface->async_iface, file, indent, offset);
+        if (type_iface_get_async_iface(iface))
+            proc(type_iface_get_async_iface(iface), file, indent, offset);
     }
 }
 
diff --git a/tools/widl/typetree.h b/tools/widl/typetree.h
index 22232fc..4eb0a0a 100644
--- a/tools/widl/typetree.h
+++ b/tools/widl/typetree.h
@@ -162,6 +162,13 @@ static inline type_t *type_iface_get_inherit(const type_t *type)
     return type->details.iface->inherit;
 }
 
+static inline type_t *type_iface_get_async_iface(const type_t *type)
+{
+    type = type_get_real_type(type);
+    assert(type_get_type(type) == TYPE_INTERFACE);
+    return type->details.iface->async_iface;
+}
+
 static inline var_list_t *type_dispiface_get_props(const type_t *type)
 {
     type = type_get_real_type(type);
diff --git a/tools/widl/widl.c b/tools/widl/widl.c
index 0bcf67b..1620dfd 100644
--- a/tools/widl/widl.c
+++ b/tools/widl/widl.c
@@ -494,10 +494,10 @@ static void write_id_data_stmts(const statement_list_t *stmts)
         uuid = get_attrp(type->attrs, ATTR_UUID);
         write_id_guid(idfile, "IID", is_attr(type->attrs, ATTR_DISPINTERFACE) ? "DIID" : "IID",
                    type->name, uuid);
-        if (type->details.iface->async_iface)
+        if (type_iface_get_async_iface(type))
         {
-          uuid = get_attrp(type->details.iface->async_iface->attrs, ATTR_UUID);
-          write_id_guid(idfile, "IID", "IID", type->details.iface->async_iface->name, uuid);
+          uuid = get_attrp(type_iface_get_async_iface(type)->attrs, ATTR_UUID);
+          write_id_guid(idfile, "IID", "IID", type_iface_get_async_iface(type)->name, uuid);
         }
       }
       else if (type_get_type(type) == TYPE_COCLASS)




More information about the wine-cvs mailing list