From: Richard Pospesel Subject: [PATCH 13/15] widl: ensure that typedefs with wire_marshal attribute are included in generated typelib Message-Id: <20190705215144.7474-12-richard@torproject.org> Date: Fri, 5 Jul 2019 14:51:42 -0700 In-Reply-To: <20190705215144.7474-11-richard@torproject.org> References: <20190705215003.7384-1-richard@torproject.org> <20190705215144.7474-1-richard@torproject.org> <20190705215144.7474-2-richard@torproject.org> <20190705215144.7474-3-richard@torproject.org> <20190705215144.7474-4-richard@torproject.org> <20190705215144.7474-5-richard@torproject.org> <20190705215144.7474-6-richard@torproject.org> <20190705215144.7474-7-richard@torproject.org> <20190705215144.7474-8-richard@torproject.org> <20190705215144.7474-9-richard@torproject.org> <20190705215144.7474-10-richard@torproject.org> <20190705215144.7474-11-richard@torproject.org> Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=47041 Signed-off-by: Richard Pospesel --- tools/widl/typelib.c | 3 +- tools/widl/write_msft.c | 74 ++++++++++++++++++++++++++++------------- 2 files changed, 53 insertions(+), 24 deletions(-) diff --git a/tools/widl/typelib.c b/tools/widl/typelib.c index 4f6b4fc38a..2c2b127699 100644 --- a/tools/widl/typelib.c +++ b/tools/widl/typelib.c @@ -129,7 +129,8 @@ unsigned short get_type_vt(type_t *t) if (vt) return vt; } - if (type_is_alias(t) && is_attr(t->attrs, ATTR_PUBLIC)) + if (type_is_alias(t) && + (is_attr(t->attrs, ATTR_PUBLIC) || is_attr(t->attrs, ATTR_WIREMARSHAL))) return VT_USERDEFINED; switch (type_get_type(t)) { diff --git a/tools/widl/write_msft.c b/tools/widl/write_msft.c index 13d768ab2e..da7ce89d12 100644 --- a/tools/widl/write_msft.c +++ b/tools/widl/write_msft.c @@ -763,7 +763,7 @@ static void add_enum_typeinfo(msft_typelib_t *typelib, type_t *enumeration); static void add_union_typeinfo(msft_typelib_t *typelib, type_t *tunion); static void add_coclass_typeinfo(msft_typelib_t *typelib, type_t *cls); static void add_dispinterface_typeinfo(msft_typelib_t *typelib, type_t *dispinterface); - +static void add_typedef_typeinfo(msft_typelib_t *typelib, type_t *tdef); /**************************************************************************** * encode_type @@ -966,33 +966,61 @@ static int encode_type( } else { - /* typedef'd types without public attribute aren't included in the typelib */ - while (type_is_alias(type) && !is_attr(type->attrs, ATTR_PUBLIC)) - type = type_alias_get_aliasee_type(type); + /* typedef'd types without public attribute aren't included in the typelib + * typedef'd types with a wire_marshal attribute must be included + */ + while (type_is_alias(type)) + { + if (is_attr(type->attrs, ATTR_WIREMARSHAL)) + { + type = get_attrp(type->attrs, ATTR_WIREMARSHAL); + break; + } + else if(!is_attr(type->attrs, ATTR_PUBLIC)) + { + type = type_alias_get_aliasee_type(type); + } + else + { + break; + } + } chat("encode_type: VT_USERDEFINED - adding new type %s, real type %d\n", type->name, type_get_type(type)); - switch (type_get_type(type)) + /* we've either fully resolved the typedef down to an actual type or + * we must include the typedef because it's a wiremarshal (or public) type + */ + if (type_is_alias(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)); + add_typedef_typeinfo(typelib, type); + } + else + { + 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; + /* fallthrough */ + case TYPE_UNION: + case TYPE_ENCAPSULATED_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]; -- 2.17.1