[PATCH 1/3] widl: Try to import typedefs instead of redefining them.

Zebediah Figura z.figura12 at gmail.com
Mon May 28 23:21:09 CDT 2018


Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
---
 tools/widl/write_msft.c | 71 ++++++++++++++++++++++++++++---------------------
 1 file changed, 41 insertions(+), 30 deletions(-)

diff --git a/tools/widl/write_msft.c b/tools/widl/write_msft.c
index 4b09317..1b05159 100644
--- a/tools/widl/write_msft.c
+++ b/tools/widl/write_msft.c
@@ -990,40 +990,51 @@ static int encode_type(
 
     case VT_USERDEFINED:
       {
+        importinfo_t *importinfo;
         int typeinfo_offset;
 
-        /* typedef'd types without public attribute aren't included in the typelib */
-        while (type->typelib_idx < 0 && type_is_alias(type) && !is_attr(type->attrs, ATTR_PUBLIC))
-          type = type_alias_get_aliasee(type);
-
-        chat("encode_type: VT_USERDEFINED - type %p name = %s real type %d idx %d\n", type,
-             type->name, type_get_type(type), type->typelib_idx);
-
-        if(type->typelib_idx == -1) {
-            chat("encode_type: trying to ref not added type\n");
-            switch (type_get_type(type)) {
-            case TYPE_STRUCT:
-                add_structure_typeinfo(typelib, type);
-                break;
-            case TYPE_INTERFACE:
-                add_interface_typeinfo(typelib, type);
-                break;
-            case TYPE_ENUM:
-                add_enum_typeinfo(typelib, type);
-                break;
-            case TYPE_UNION:
-                add_union_typeinfo(typelib, type);
-                break;
-            case TYPE_COCLASS:
-                add_coclass_typeinfo(typelib, type);
-                break;
-            default:
-                error("encode_type: VT_USERDEFINED - unhandled type %d\n",
-                      type_get_type(type));
-            }
+        if ((importinfo = find_importinfo(typelib, type->name)))
+        {
+            chat("encode_type: VT_USERDEFINED - found imported type %s in %s\n",
+                type->name, importinfo->importlib->name);
+            alloc_importinfo(typelib, importinfo);
+            typeinfo_offset = importinfo->offset | 0x1;
         }
+        else
+        {
+            /* typedef'd types without public attribute aren't included in the typelib */
+            while (type->typelib_idx < 0 && type_is_alias(type) && !is_attr(type->attrs, ATTR_PUBLIC))
+              type = type_alias_get_aliasee(type);
 
-        typeinfo_offset = typelib->typelib_typeinfo_offsets[type->typelib_idx];
+            chat("encode_type: VT_USERDEFINED - type %p name = %s real type %d idx %d\n", type,
+                 type->name, type_get_type(type), type->typelib_idx);
+
+            if(type->typelib_idx == -1) {
+                chat("encode_type: trying to ref not added type\n");
+                switch (type_get_type(type)) {
+                case TYPE_STRUCT:
+                    add_structure_typeinfo(typelib, type);
+                    break;
+                case TYPE_INTERFACE:
+                    add_interface_typeinfo(typelib, type);
+                    break;
+                case TYPE_ENUM:
+                    add_enum_typeinfo(typelib, type);
+                    break;
+                case TYPE_UNION:
+                    add_union_typeinfo(typelib, type);
+                    break;
+                case TYPE_COCLASS:
+                    add_coclass_typeinfo(typelib, type);
+                    break;
+                default:
+                    error("encode_type: VT_USERDEFINED - unhandled type %d\n",
+                          type_get_type(type));
+                }
+            }
+
+            typeinfo_offset = typelib->typelib_typeinfo_offsets[type->typelib_idx];
+        }
 	for (typeoffset = 0; typeoffset < typelib->typelib_segdir[MSFT_SEG_TYPEDESC].length; typeoffset += 8) {
 	    typedata = (void *)&typelib->typelib_segment_data[MSFT_SEG_TYPEDESC][typeoffset];
 	    if ((typedata[0] == ((0x7fff << 16) | VT_USERDEFINED)) && (typedata[1] == typeinfo_offset)) break;
-- 
2.7.4




More information about the wine-devel mailing list