Zebediah Figura : widl: Create exactly one type_t object per named structure type.

Alexandre Julliard julliard at winehq.org
Tue Aug 20 15:35:22 CDT 2019


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

Author: Zebediah Figura <z.figura12 at gmail.com>
Date:   Mon Aug 19 21:17:37 2019 -0500

widl: Create exactly one type_t object per named structure type.

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>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 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 bdbd440..9db8ebd 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 a066125..05e9684 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;
 }
 




More information about the wine-cvs mailing list