Zebediah Figura : widl: Output a registry script for all interfaces written into the typelib.

Alexandre Julliard julliard at winehq.org
Tue Jun 2 08:11:15 CDT 2020


Module: wine
Branch: stable
Commit: 5b2a6414ae5551613e5d487d85c42ae2d3889688
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=5b2a6414ae5551613e5d487d85c42ae2d3889688

Author: Zebediah Figura <z.figura12 at gmail.com>
Date:   Tue Jan 28 10:10:27 2020 -0600

widl: Output a registry script for all interfaces written into the typelib.

Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=46005
Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
(cherry picked from commit 56995dd3223c59340037d33a6073a42bdbba1d3f)
Signed-off-by: Michael Stefaniuc <mstefani at winehq.org>

---

 tools/widl/parser.y     |  1 +
 tools/widl/register.c   | 11 +++--------
 tools/widl/widltypes.h  |  3 +++
 tools/widl/write_msft.c | 11 +++++++++++
 4 files changed, 18 insertions(+), 8 deletions(-)

diff --git a/tools/widl/parser.y b/tools/widl/parser.y
index 5f6eb50878..92b4f8ebd5 100644
--- a/tools/widl/parser.y
+++ b/tools/widl/parser.y
@@ -1792,6 +1792,7 @@ static type_t *make_safearray(type_t *type)
 static typelib_t *make_library(const char *name, const attr_list_t *attrs)
 {
     typelib_t *typelib = xmalloc(sizeof(*typelib));
+    memset(typelib, 0, sizeof(*typelib));
     typelib->name = xstrdup(name);
     typelib->attrs = attrs;
     list_init( &typelib->importlibs );
diff --git a/tools/widl/register.c b/tools/widl/register.c
index f65cbddf53..c03ab3c56b 100644
--- a/tools/widl/register.c
+++ b/tools/widl/register.c
@@ -119,8 +119,6 @@ static void write_typelib_interface( const type_t *iface, const typelib_t *typel
 
     if (!uuid) return;
     if (!is_object( iface )) return;
-    if (!is_attr( iface->attrs, ATTR_OLEAUTOMATION ) && !is_attr( iface->attrs, ATTR_DISPINTERFACE ))
-        return;
     put_str( indent, "'%s' = s '%s'\n", format_uuid( uuid ), iface->name );
     put_str( indent, "{\n" );
     indent++;
@@ -137,13 +135,10 @@ static void write_typelib_interface( const type_t *iface, const typelib_t *typel
 
 static void write_typelib_interfaces( const typelib_t *typelib )
 {
-    const statement_t *stmt;
+    unsigned int i;
 
-    if (typelib->stmts) LIST_FOR_EACH_ENTRY( stmt, typelib->stmts, const statement_t, entry )
-    {
-        if (stmt->type == STMT_TYPE && type_get_type( stmt->u.type ) == TYPE_INTERFACE)
-            write_typelib_interface( stmt->u.type, typelib );
-    }
+    for (i = 0; i < typelib->reg_iface_count; ++i)
+        write_typelib_interface( typelib->reg_ifaces[i], typelib );
 }
 
 static int write_coclass( const type_t *class, const typelib_t *typelib )
diff --git a/tools/widl/widltypes.h b/tools/widl/widltypes.h
index 5e28329278..085a0ff55f 100644
--- a/tools/widl/widltypes.h
+++ b/tools/widl/widltypes.h
@@ -538,6 +538,9 @@ struct _typelib_t {
     const attr_list_t *attrs;
     struct list importlibs;
     statement_list_t *stmts;
+
+    type_t **reg_ifaces;
+    unsigned int reg_iface_count;
 };
 
 struct _user_type_t {
diff --git a/tools/widl/write_msft.c b/tools/widl/write_msft.c
index dc0a6cb45b..3a11d2ddd7 100644
--- a/tools/widl/write_msft.c
+++ b/tools/widl/write_msft.c
@@ -2068,6 +2068,10 @@ static void add_dispinterface_typeinfo(msft_typelib_t *typelib, type_t *dispinte
             if(add_func_desc(msft_typeinfo, func, idx) == S_OK)
                 idx++;
     }
+
+        typelib->typelib->reg_ifaces = xrealloc(typelib->typelib->reg_ifaces,
+                (typelib->typelib->reg_iface_count + 1) * sizeof(dispinterface));
+    typelib->typelib->reg_ifaces[typelib->typelib->reg_iface_count++] = dispinterface;
 }
 
 static void add_interface_typeinfo(msft_typelib_t *typelib, type_t *interface)
@@ -2142,6 +2146,13 @@ static void add_interface_typeinfo(msft_typelib_t *typelib, type_t *interface)
         if(add_func_desc(msft_typeinfo, func, idx) == S_OK)
             idx++;
     }
+
+    if (is_attr(interface->attrs, ATTR_OLEAUTOMATION) || is_attr(interface->attrs, ATTR_DUAL))
+    {
+        typelib->typelib->reg_ifaces = xrealloc(typelib->typelib->reg_ifaces,
+                (typelib->typelib->reg_iface_count + 1) * sizeof(interface));
+        typelib->typelib->reg_ifaces[typelib->typelib->reg_iface_count++] = interface;
+    }
 }
 
 static void add_structure_typeinfo(msft_typelib_t *typelib, type_t *structure)




More information about the wine-cvs mailing list