From: Richard Pospesel Subject: [PATCH 12/18] widl: remove remaining instances of duptype function and replace with specific dup_pointer_type function for the remaining single valid case Message-Id: <20190606013415.23642-12-richard@torproject.org> Date: Wed, 5 Jun 2019 18:34:09 -0700 In-Reply-To: <20190606013415.23642-1-richard@torproject.org> References: <20190606013415.23642-1-richard@torproject.org> Signed-off-by: Richard Pospesel --- tools/widl/parser.y | 2 +- tools/widl/typetree.c | 22 +++++++++++++++------- tools/widl/typetree.h | 4 ++-- tools/widl/widltypes.h | 2 +- 4 files changed, 19 insertions(+), 11 deletions(-) diff --git a/tools/widl/parser.y b/tools/widl/parser.y index 54dd3421c2..25bfa959f8 100644 --- a/tools/widl/parser.y +++ b/tools/widl/parser.y @@ -1652,7 +1652,7 @@ static var_t *declare_var(attr_list_t *attrs, decl_spec_t *declspec, const decla * store an offset to the typeformat string in the type object, but * two typeformat strings may be written depending on whether the * pointer is a toplevel parameter or not */ - *pt = duptype(*pt, 1); + *pt = dup_pointer_type(*pt); } } else if (ptr_attr) diff --git a/tools/widl/typetree.c b/tools/widl/typetree.c index 7a4c8a50c5..d13bb71893 100644 --- a/tools/widl/typetree.c +++ b/tools/widl/typetree.c @@ -30,12 +30,16 @@ #include "typetree.h" #include "header.h" -type_t *duptype(type_t *t, int dupname) +/* this function is only used in declare_var in parser.y, see FIXME note */ +type_t *dup_pointer_type(type_t *t) { - type_t *d = alloc_type(); + type_t *d; + assert(is_ptr(t) && t->details.pointer.def_fc != FC_RP); + + d = alloc_type(); *d = *t; - if (dupname && t->name) + if (t->name) d->name = xstrdup(t->name); return d; @@ -189,15 +193,19 @@ type_t *type_new_pointer(unsigned char pointer_default, type_t *ref, attr_list_t type_t *type_new_alias(const decl_spec_t *ds, const char *name) { - type_t *t = ds->type; - type_t *a = duptype(t, 0); + type_t *a = NULL; + + assert(ds != NULL); + assert(name != NULL); + + a = alloc_type(); + /* copy over all the members before setting alias data */ + *a = *ds->type; a->name = xstrdup(name); a->attrs = NULL; a->orig = *ds; a->is_alias = TRUE; - /* for pointer types */ - a->details = t->details; init_loc_info(&a->loc_info); return a; diff --git a/tools/widl/typetree.h b/tools/widl/typetree.h index 2b0e8ba42d..da5deb4cef 100644 --- a/tools/widl/typetree.h +++ b/tools/widl/typetree.h @@ -53,8 +53,8 @@ type_t *type_coclass_define(type_t *coclass, ifref_list_t *ifaces); int type_is_equal(const type_t *type1, const type_t *type2); const char *type_get_name(const type_t *type, enum name_type name_type); -/* FIXME: shouldn't need to export this */ -type_t *duptype(type_t *t, int dupname); +/* copy pointer type to deal with need for duplicate typeformat strings */ +type_t *dup_pointer_type(type_t *t); /* un-alias the type until finding the non-alias type */ static inline type_t *type_get_real_type(const type_t *type) diff --git a/tools/widl/widltypes.h b/tools/widl/widltypes.h index b3665bc4bb..17477a604f 100644 --- a/tools/widl/widltypes.h +++ b/tools/widl/widltypes.h @@ -454,7 +454,7 @@ struct _type_t { struct bitfield_details bitfield; } details; const char *c_name; - decl_spec_t orig; /* dup'd types */ + decl_spec_t orig; /* aliased types */ unsigned int typestring_offset; unsigned int ptrdesc; /* used for complex structs */ int typelib_idx; -- 2.17.1