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