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