[PATCH 2/4] widl: Create exactly one type_t object per named structure type.

Zebediah Figura z.figura12 at gmail.com
Mon Aug 19 21:17:37 CDT 2019


Regardless of whether we are writing a typelib.

Based on a patch by Richard Pospesel.

Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
---
 tools/widl/parser.y   |  2 +-
 tools/widl/typetree.c | 30 +++++++++++++-----------------
 2 files changed, 14 insertions(+), 18 deletions(-)

diff --git a/tools/widl/parser.y b/tools/widl/parser.y
index bdbd44040c..9db8ebd6fc 100644
--- a/tools/widl/parser.y
+++ b/tools/widl/parser.y
@@ -1880,7 +1880,7 @@ type_t *reg_type(type_t *type, const char *name, struct namespace *namespace, in
   nt->t = t;
   nt->next = namespace->type_hash[hash];
   namespace->type_hash[hash] = nt;
-  if ((t == tsSTRUCT || t == tsUNION))
+  if ((t == tsUNION))
     fix_incomplete_types(type);
   return type;
 }
diff --git a/tools/widl/typetree.c b/tools/widl/typetree.c
index a066125b16..05e96844d8 100644
--- a/tools/widl/typetree.c
+++ b/tools/widl/typetree.c
@@ -291,31 +291,27 @@ type_t *type_new_enum(const char *name, struct namespace *namespace, int defined
 
 type_t *type_new_struct(char *name, struct namespace *namespace, int defined, var_list_t *fields)
 {
-    type_t *tag_type = name ? find_type(name, namespace, tsSTRUCT) : NULL;
-    type_t *t;
+    type_t *t = NULL;
 
-    /* avoid creating duplicate typelib type entries */
-    if (tag_type && do_typelib) return tag_type;
+    if (name)
+        t = find_type(name, namespace, tsSTRUCT);
 
-    t = make_type(TYPE_STRUCT);
-    t->name = name;
-    t->namespace = namespace;
+    if (!t)
+    {
+        t = make_type(TYPE_STRUCT);
+        t->name = name;
+        t->namespace = namespace;
+        if (name)
+            reg_type(t, name, namespace, tsSTRUCT);
+    }
 
-    if (tag_type && tag_type->details.structure)
-        t->details.structure = tag_type->details.structure;
-    else if (defined)
+    if (!t->defined && defined)
     {
         t->details.structure = xmalloc(sizeof(*t->details.structure));
         t->details.structure->fields = fields;
         t->defined = TRUE;
     }
-    if (name)
-    {
-        if (defined)
-            reg_type(t, name, namespace, tsSTRUCT);
-        else
-            add_incomplete(t);
-    }
+
     return t;
 }
 
-- 
2.22.0




More information about the wine-devel mailing list