Zebediah Figura : widl: Try to import typedefs instead of redefining them.

Alexandre Julliard julliard at winehq.org
Tue May 29 16:08:30 CDT 2018


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

Author: Zebediah Figura <z.figura12 at gmail.com>
Date:   Tue May 29 08:49:34 2018 +0100

widl: Try to import typedefs instead of redefining them.

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

---

 tools/widl/write_msft.c | 69 +++++++++++++++++++++++++++++--------------------
 1 file changed, 41 insertions(+), 28 deletions(-)

diff --git a/tools/widl/write_msft.c b/tools/widl/write_msft.c
index 4b09317..8ce34d9 100644
--- a/tools/widl/write_msft.c
+++ b/tools/widl/write_msft.c
@@ -990,40 +990,53 @@ 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);
+        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);
 
-        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);
+            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 (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];
+            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;




More information about the wine-cvs mailing list