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