widl [3/5]: Don't duplicate typeinfos in typelibs

Dan Hipschman dsh at linux.ucla.edu
Fri Jul 28 15:44:21 CDT 2006


This patch makes it so that when we add a typeinfo to the typelib, we first
check to see if it's already there.  If so, there's no reason to add it
again (without this you sometimes end up getting duplicate copies of the same
typeinfo in the typelib.

ChangeLog:
* Check if a typeinfo is already in a typelib before adding it
---
 tools/widl/write_msft.c |   18 ++++++++++++++++++
 1 files changed, 18 insertions(+), 0 deletions(-)

diff --git a/tools/widl/write_msft.c b/tools/widl/write_msft.c
index 4382e52..aae864a 100644
--- a/tools/widl/write_msft.c
+++ b/tools/widl/write_msft.c
@@ -1894,6 +1894,9 @@ static void add_dispinterface_typeinfo(m
     var_t *var;
     msft_typeinfo_t *msft_typeinfo;
 
+    if (-1 < dispinterface->typelib_idx)
+        return;
+
     dispinterface->typelib_idx = typelib->typelib_header.nrtypeinfos;
     msft_typeinfo = create_msft_typeinfo(typelib, TKIND_DISPATCH, dispinterface->name,
                                          dispinterface->attrs, typelib->typelib_header.nrtypeinfos);
@@ -1943,6 +1946,9 @@ static void add_interface_typeinfo(msft_
     const attr_t *attr;
     const type_t *derived;
 
+    if (-1 < interface->typelib_idx)
+        return;
+
     for(attr = interface->attrs; attr; attr = NEXT_LINK(attr))
         if(attr->type == ATTR_DISPINTERFACE)
             return add_dispinterface_typeinfo(typelib, interface);
@@ -2005,6 +2011,9 @@ static void add_structure_typeinfo(msft_
     var_t *cur = structure->fields;
     msft_typeinfo_t *msft_typeinfo;
 
+    if (-1 < structure->typelib_idx)
+        return;
+
     structure->typelib_idx = typelib->typelib_header.nrtypeinfos;
     msft_typeinfo = create_msft_typeinfo(typelib, TKIND_RECORD, structure->name, structure->attrs,
                                          typelib->typelib_header.nrtypeinfos);
@@ -2043,6 +2052,9 @@ static void add_typedef_typeinfo(msft_ty
     int alignment;
     const attr_t *attrs;
 
+    if (-1 < tdef->type->typelib_idx)
+        return;
+
     tdef->type->typelib_idx = typelib->typelib_header.nrtypeinfos;
     msft_typeinfo = create_msft_typeinfo(typelib, TKIND_ALIAS, tdef->name, tdef->type->attrs,
                                          typelib->typelib_header.nrtypeinfos);
@@ -2063,6 +2075,9 @@ static void add_coclass_typeinfo(msft_ty
     int have_default = 0, have_default_source = 0;
     const attr_t *attr;
 
+    if (-1 < cls->typelib_idx)
+        return;
+
     cls->typelib_idx = typelib->typelib_header.nrtypeinfos;
     msft_typeinfo = create_msft_typeinfo(typelib, TKIND_COCLASS, cls->name, cls->attrs,
                                          typelib->typelib_header.nrtypeinfos);
@@ -2141,6 +2156,9 @@ static void add_module_typeinfo(msft_typ
     func_t *func;
     msft_typeinfo_t *msft_typeinfo;
 
+    if (-1 < module->typelib_idx)
+        return;
+
     module->typelib_idx = typelib->typelib_header.nrtypeinfos;
     msft_typeinfo = create_msft_typeinfo(typelib, TKIND_MODULE, module->name, module->attrs,
                                          typelib->typelib_header.nrtypeinfos);



More information about the wine-patches mailing list