From: Richard Pospesel Subject: [PATCH 02/15] widl: refactor to have array type's element use decl_spec_t rather than type_t Message-Id: <20190705215144.7474-1-richard@torproject.org> Date: Fri, 5 Jul 2019 14:51:31 -0700 In-Reply-To: <20190705215003.7384-1-richard@torproject.org> References: <20190705215003.7384-1-richard@torproject.org> Signed-off-by: Richard Pospesel --- tools/widl/expr.c | 4 +-- tools/widl/header.c | 8 +++--- tools/widl/header.h | 2 +- tools/widl/parser.y | 16 +++++------ tools/widl/typegen.c | 60 ++++++++++++++++++++--------------------- tools/widl/typelib.c | 4 +-- tools/widl/typetree.c | 2 +- tools/widl/typetree.h | 9 +++++-- tools/widl/widltypes.h | 2 +- tools/widl/write_msft.c | 12 ++++----- 10 files changed, 62 insertions(+), 57 deletions(-) diff --git a/tools/widl/expr.c b/tools/widl/expr.c index 7ec42db79f..55efc694dd 100644 --- a/tools/widl/expr.c +++ b/tools/widl/expr.c @@ -583,7 +583,7 @@ static struct expression_type resolve_expression(const struct expr_loc *expr_loc result.type = type_pointer_get_ref(result.type); else if(result.type && is_array(result.type) && type_array_is_decl_as_ptr(result.type)) - result.type = type_array_get_element(result.type); + result.type = type_array_get_element_type(result.type); else error_loc_info(&expr_loc->v->loc_info, "dereference operator applied to non-pointer type in expression%s%s\n", expr_loc->attr ? " for attribute " : "", @@ -665,7 +665,7 @@ static struct expression_type resolve_expression(const struct expr_loc *expr_loc if (result.type && is_array(result.type)) { struct expression_type index_result; - result.type = type_array_get_element(result.type); + result.type = type_array_get_element_type(result.type); index_result = resolve_expression(expr_loc, cont_type /* FIXME */, e->u.ext); if (!index_result.type || !is_integer_type(index_result.type)) error_loc_info(&expr_loc->v->loc_info, "array subscript not of integral type in expression%s%s\n", diff --git a/tools/widl/header.c b/tools/widl/header.c index 3e8cbfae5e..c10b149d89 100644 --- a/tools/widl/header.c +++ b/tools/widl/header.c @@ -361,9 +361,9 @@ void write_type_left(FILE *h, type_t *t, enum name_type name_type, int declonly) fprintf(h, "%s", t->name); else { - write_type_left(h, type_array_get_element(t), name_type, declonly); + write_type_left(h, type_array_get_element_type(t), name_type, declonly); if (type_array_is_decl_as_ptr(t)) - write_pointer_left(h, type_array_get_element(t)); + write_pointer_left(h, type_array_get_element_type(t)); } break; case TYPE_BASIC: @@ -443,7 +443,7 @@ void write_type_right(FILE *h, type_t *t, int is_field) { case TYPE_ARRAY: { - type_t *elem = type_array_get_element(t); + type_t *elem = type_array_get_element_type(t); if (type_array_is_decl_as_ptr(t)) { if (!type_is_alias(elem) && is_array(elem) && !type_array_is_decl_as_ptr(elem)) @@ -705,7 +705,7 @@ void check_for_additional_prototype_types(type_t *type) else if (is_ptr(type)) type = type_pointer_get_ref(type); else if (is_array(type)) - type = type_array_get_element(type); + type = type_array_get_element_type(type); else break; } diff --git a/tools/widl/header.h b/tools/widl/header.h index 0d44b4039f..e4aa0f0088 100644 --- a/tools/widl/header.h +++ b/tools/widl/header.h @@ -88,7 +88,7 @@ static inline int last_ptr(const type_t *type) static inline int last_array(const type_t *type) { - return is_array(type) && !is_array(type_array_get_element(type)); + return is_array(type) && !is_array(type_array_get_element_type(type)); } static inline int is_string_type(const attr_list_t *attrs, const type_t *type) diff --git a/tools/widl/parser.y b/tools/widl/parser.y index 50e42291bd..6075d231f6 100644 --- a/tools/widl/parser.y +++ b/tools/widl/parser.y @@ -1469,7 +1469,7 @@ static type_t *get_array_or_ptr_ref(type_t *type) if (is_ptr(type)) return type_pointer_get_ref(type); else if (is_array(type)) - return type_array_get_element(type); + return type_array_get_element_type(type); return NULL; } @@ -1485,7 +1485,7 @@ static type_t *append_chain_type(type_t *chain, type_t *type) if (is_ptr(chain_type)) chain_type->details.pointer.ref = type; else if (is_array(chain_type)) - chain_type->details.array.elem = type; + chain_type->details.array.elem.type = type; else assert(0); @@ -1587,7 +1587,7 @@ static var_t *declare_var(attr_list_t *attrs, decl_spec_t *decl_spec, const decl if (is_ptr(t)) t = type_pointer_get_ref(t); else if (is_array(t)) - t = type_array_get_element(t); + t = type_array_get_element_type(t); else break; } @@ -1624,7 +1624,7 @@ static var_t *declare_var(attr_list_t *attrs, decl_spec_t *decl_spec, const decl error_loc("%s: cannot specify size_is for an already sized array\n", v->name); else *ptype = type_new_array((*ptype)->name, - type_array_get_element(*ptype), FALSE, + type_array_get_element_type(*ptype), FALSE, 0, dim, NULL, FC_RP); } else if (is_ptr(*ptype)) @@ -1637,7 +1637,7 @@ static var_t *declare_var(attr_list_t *attrs, decl_spec_t *decl_spec, const decl if (is_ptr(*ptype)) ptype = &(*ptype)->details.pointer.ref; else if (is_array(*ptype)) - ptype = &(*ptype)->details.array.elem; + ptype = &(*ptype)->details.array.elem.type; else error_loc("%s: too many expressions in size_is attribute\n", v->name); } @@ -1650,7 +1650,7 @@ static var_t *declare_var(attr_list_t *attrs, decl_spec_t *decl_spec, const decl if (is_array(*ptype)) { *ptype = type_new_array((*ptype)->name, - type_array_get_element(*ptype), + type_array_get_element_type(*ptype), type_array_is_decl_as_ptr(*ptype), type_array_get_dim(*ptype), type_array_get_conformance(*ptype), @@ -1663,7 +1663,7 @@ static var_t *declare_var(attr_list_t *attrs, decl_spec_t *decl_spec, const decl if (is_ptr(*ptype)) ptype = &(*ptype)->details.pointer.ref; else if (is_array(*ptype)) - ptype = &(*ptype)->details.array.elem; + ptype = &(*ptype)->details.array.elem.type; else error_loc("%s: too many expressions in length_is attribute\n", v->name); } @@ -2648,7 +2648,7 @@ static void check_field_common(const type_t *container_type, more_to_do = TRUE; break; case TGT_ARRAY: - type = type_array_get_element(type); + type = type_array_get_element_type(type); more_to_do = TRUE; break; case TGT_USER_TYPE: diff --git a/tools/widl/typegen.c b/tools/widl/typegen.c index f685f7156a..19255ec850 100644 --- a/tools/widl/typegen.c +++ b/tools/widl/typegen.c @@ -510,7 +510,7 @@ unsigned char get_struct_fc(const type_t *type) continue; } - if (is_array(type_array_get_element(field->declspec.type))) + if (is_array(type_array_get_element_type(field->declspec.type))) return FC_BOGUS_STRUCT; if (type_array_has_conformance(field->declspec.type)) @@ -523,7 +523,7 @@ unsigned char get_struct_fc(const type_t *type) if (type_array_has_variance(t)) has_variance = 1; - t = type_array_get_element(t); + t = type_array_get_element_type(t); typegen_type = typegen_detect_type(t, field->attrs, TDT_IGNORE_STRINGS); } @@ -625,7 +625,7 @@ static unsigned char get_array_fc(const type_t *type) const expr_t *size_is; const type_t *elem_type; - elem_type = type_array_get_element(type); + elem_type = type_array_get_element_type(type); size_is = type_array_get_conformance(type); if (!size_is) @@ -714,7 +714,7 @@ static int type_has_pointers(const type_t *type) case TGT_POINTER: return TRUE; case TGT_ARRAY: - return type_array_is_decl_as_ptr(type) || type_has_pointers(type_array_get_element(type)); + return type_array_is_decl_as_ptr(type) || type_has_pointers(type_array_get_element_type(type)); case TGT_STRUCT: { var_list_t *fields = type_struct_get_fields(type); @@ -768,7 +768,7 @@ static int type_has_full_pointer(const type_t *type, const attr_list_t *attrs, if (get_pointer_fc(type, attrs, toplevel_param) == FC_FP) return TRUE; else - return type_has_full_pointer(type_array_get_element(type), NULL, FALSE); + return type_has_full_pointer(type_array_get_element_type(type), NULL, FALSE); case TGT_STRUCT: { var_list_t *fields = type_struct_get_fields(type); @@ -1944,12 +1944,12 @@ unsigned int type_memsize_and_alignment(const type_t *t, unsigned int *align) { if (is_conformant_array(t)) { - type_memsize_and_alignment(type_array_get_element(t), align); + type_memsize_and_alignment(type_array_get_element_type(t), align); size = 0; } else size = type_array_get_dim(t) * - type_memsize_and_alignment(type_array_get_element(t), align); + type_memsize_and_alignment(type_array_get_element_type(t), align); } else /* declared as a pointer */ { @@ -2054,7 +2054,7 @@ static unsigned int type_buffer_alignment(const type_t *t) break; case TYPE_ARRAY: if (!type_array_is_decl_as_ptr(t)) - return type_buffer_alignment( type_array_get_element(t) ); + return type_buffer_alignment( type_array_get_element_type(t) ); /* else fall through */ case TYPE_POINTER: return 4; @@ -2378,7 +2378,7 @@ static void write_member_type(FILE *file, const type_t *cont, static void write_array_element_type(FILE *file, const attr_list_t *attrs, const type_t *type, int cont_is_complex, unsigned int *tfsoff) { - type_t *elem = type_array_get_element(type); + type_t *elem = type_array_get_element_type(type); if (!is_embedded_complex(elem) && is_ptr(elem)) { @@ -2506,7 +2506,7 @@ static int write_pointer_description_offsets( if (is_array(type)) { return write_pointer_description_offsets( - file, attrs, type_array_get_element(type), offset_in_memory, + file, attrs, type_array_get_element_type(type), offset_in_memory, offset_in_buffer, typestring_offset); } else if (is_non_complex_struct(type)) @@ -2609,14 +2609,14 @@ static int write_fixed_array_pointer_descriptions( /* unfortunately, this needs to be done in two passes to avoid * writing out redundant FC_FIXED_REPEAT descriptions */ pointer_count = write_pointer_description_offsets( - NULL, attrs, type_array_get_element(type), NULL, NULL, &temp); + NULL, attrs, type_array_get_element_type(type), NULL, NULL, &temp); if (pointer_count > 0) { unsigned int increment_size; unsigned int offset_of_array_pointer_mem = 0; unsigned int offset_of_array_pointer_buf = 0; - increment_size = type_memsize(type_array_get_element(type)); + increment_size = type_memsize(type_array_get_element_type(type)); print_file(file, 2, "0x%02x, /* FC_FIXED_REPEAT */\n", FC_FIXED_REPEAT); print_file(file, 2, "0x%02x, /* FC_PAD */\n", FC_PAD); @@ -2680,14 +2680,14 @@ static int write_conformant_array_pointer_descriptions( /* unfortunately, this needs to be done in two passes to avoid * writing out redundant FC_VARIABLE_REPEAT descriptions */ pointer_count = write_pointer_description_offsets( - NULL, attrs, type_array_get_element(type), NULL, NULL, &temp); + NULL, attrs, type_array_get_element_type(type), NULL, NULL, &temp); if (pointer_count > 0) { unsigned int increment_size; unsigned int offset_of_array_pointer_mem = offset_in_memory; unsigned int offset_of_array_pointer_buf = offset_in_memory; - increment_size = type_memsize(type_array_get_element(type)); + increment_size = type_memsize(type_array_get_element_type(type)); if (increment_size > USHRT_MAX) error("array size of %u bytes is too large\n", increment_size); @@ -2700,7 +2700,7 @@ static int write_conformant_array_pointer_descriptions( *typestring_offset += 8; pointer_count = write_pointer_description_offsets( - file, attrs, type_array_get_element(type), + file, attrs, type_array_get_element_type(type), &offset_of_array_pointer_mem, &offset_of_array_pointer_buf, typestring_offset); } @@ -2724,12 +2724,12 @@ static int write_varying_array_pointer_descriptions( /* unfortunately, this needs to be done in two passes to avoid * writing out redundant FC_VARIABLE_REPEAT descriptions */ pointer_count = write_pointer_description_offsets( - NULL, attrs, type_array_get_element(type), NULL, NULL, &temp); + NULL, attrs, type_array_get_element_type(type), NULL, NULL, &temp); if (pointer_count > 0) { unsigned int increment_size; - increment_size = type_memsize(type_array_get_element(type)); + increment_size = type_memsize(type_array_get_element_type(type)); if (increment_size > USHRT_MAX) error("array size of %u bytes is too large\n", increment_size); @@ -2742,7 +2742,7 @@ static int write_varying_array_pointer_descriptions( *typestring_offset += 8; pointer_count = write_pointer_description_offsets( - file, attrs, type_array_get_element(type), offset_in_memory, + file, attrs, type_array_get_element_type(type), offset_in_memory, offset_in_buffer, typestring_offset); } } @@ -2864,7 +2864,7 @@ static unsigned int write_string_tfs(FILE *file, const attr_list_t *attrs, } if (is_array(type)) - elem_type = type_array_get_element(type); + elem_type = type_array_get_element_type(type); else elem_type = type_pointer_get_ref(type); @@ -2957,11 +2957,11 @@ static unsigned int write_array_tfs(FILE *file, const attr_list_t *attrs, type_t ? type_memsize(current_structure) : 0; - if (!is_string_type(attrs, type_array_get_element(type))) - write_embedded_types(file, attrs, type_array_get_element(type), name, FALSE, typestring_offset); + if (!is_string_type(attrs, type_array_get_element_type(type))) + write_embedded_types(file, attrs, type_array_get_element_type(type), name, FALSE, typestring_offset); - size = type_memsize(is_conformant_array(type) ? type_array_get_element(type) : type); - align = type_buffer_alignment(is_conformant_array(type) ? type_array_get_element(type) : type); + size = type_memsize(is_conformant_array(type) ? type_array_get_element_type(type) : type); + align = type_buffer_alignment(is_conformant_array(type) ? type_array_get_element_type(type) : type); fc = get_array_fc(type); start_offset = *typestring_offset; @@ -2992,7 +2992,7 @@ static unsigned int write_array_tfs(FILE *file, const attr_list_t *attrs, type_t if (fc == FC_SMVARRAY || fc == FC_LGVARRAY) { - unsigned int elsize = type_memsize(type_array_get_element(type)); + unsigned int elsize = type_memsize(type_array_get_element_type(type)); unsigned int dim = type_array_get_dim(type); if (fc == FC_LGVARRAY) @@ -3015,7 +3015,7 @@ static unsigned int write_array_tfs(FILE *file, const attr_list_t *attrs, type_t += write_conf_or_var_desc(file, current_structure, baseoff, type, length_is); - if (type_has_pointers(type_array_get_element(type)) && + if (type_has_pointers(type_array_get_element_type(type)) && (type_array_is_decl_as_ptr(type) || !current_structure)) { print_file(file, 2, "0x%x,\t/* FC_PP */\n", FC_PP); @@ -3868,7 +3868,7 @@ static unsigned int get_required_buffer_size_type( case FC_SMFARRAY: case FC_LGFARRAY: return type_array_get_dim(type) * - get_required_buffer_size_type(type_array_get_element(type), name, + get_required_buffer_size_type(type_array_get_element_type(type), name, NULL, FALSE, alignment); } } @@ -4098,7 +4098,7 @@ expr_t *get_size_is_expr(const type_t *t, const char *name) { expr_t *x = NULL; - for ( ; is_array(t); t = type_array_get_element(t)) + for ( ; is_array(t); t = type_array_get_element_type(t)) if (type_array_has_conformance(t) && type_array_get_conformance(t)->type != EXPR_VOID) { @@ -4704,7 +4704,7 @@ void assign_stub_out_args( FILE *file, int indent, const var_t *func, const char fprintf(file, " = NdrAllocate(&__frame->_StubMsg, "); for (type = var->declspec.type; is_array(type) && type_array_has_conformance(type); - type = type_array_get_element(type)) + type = type_array_get_element_type(type)) { write_expr(file, type_array_get_conformance(type), TRUE, TRUE, NULL, NULL, local_var_prefix); @@ -4716,7 +4716,7 @@ void assign_stub_out_args( FILE *file, int indent, const var_t *func, const char print_file(file, indent, "memset(%s%s, 0, ", local_var_prefix, var->name); for (type = var->declspec.type; is_array(type) && type_array_has_conformance(type); - type = type_array_get_element(type)) + type = type_array_get_element_type(type)) { write_expr(file, type_array_get_conformance(type), TRUE, TRUE, NULL, NULL, local_var_prefix); @@ -4750,7 +4750,7 @@ void assign_stub_out_args( FILE *file, int indent, const var_t *func, const char print_file(file, indent, "%s_W%u = 0;\n", local_var_prefix, i); break; } - ref = type_array_get_element(ref); + ref = type_array_get_element_type(ref); /* fall through */ case TGT_STRUCT: case TGT_UNION: diff --git a/tools/widl/typelib.c b/tools/widl/typelib.c index 93f8f4de19..bf667a9a23 100644 --- a/tools/widl/typelib.c +++ b/tools/widl/typelib.c @@ -97,7 +97,7 @@ static unsigned short builtin_vt(const type_t *t) { const type_t *elem_type; if (is_array(t)) - elem_type = type_array_get_element(t); + elem_type = type_array_get_element_type(t); else elem_type = type_pointer_get_ref(t); if (type_get_type(elem_type) == TYPE_BASIC) @@ -198,7 +198,7 @@ unsigned short get_type_vt(type_t *t) case TYPE_ARRAY: if (type_array_is_decl_as_ptr(t)) { - if (match(type_array_get_element(t)->name, "SAFEARRAY")) + if (match(type_array_get_element_type(t)->name, "SAFEARRAY")) return VT_SAFEARRAY; return VT_PTR; } diff --git a/tools/widl/typetree.c b/tools/widl/typetree.c index 3b0c944387..51e54d2a9f 100644 --- a/tools/widl/typetree.c +++ b/tools/widl/typetree.c @@ -235,7 +235,7 @@ type_t *type_new_array(const char *name, type_t *element, int declptr, t->details.array.size_is = size_is; else t->details.array.dim = dim; - t->details.array.elem = element; + t->details.array.elem.type = element; t->details.array.ptr_def_fc = ptr_default_fc; return t; } diff --git a/tools/widl/typetree.h b/tools/widl/typetree.h index 9f0dc5afc6..3205d58450 100644 --- a/tools/widl/typetree.h +++ b/tools/widl/typetree.h @@ -250,11 +250,16 @@ static inline expr_t *type_array_get_variance(const type_t *type) return type->details.array.length_is; } -static inline type_t *type_array_get_element(const type_t *type) +static inline const decl_spec_t *type_array_get_element(const type_t *type) { type = type_get_real_type(type); assert(type_get_type(type) == TYPE_ARRAY); - return type->details.array.elem; + return &type->details.array.elem; +} + +static inline type_t *type_array_get_element_type(const type_t *type) +{ + return type_array_get_element(type)->type; } static inline int type_array_is_decl_as_ptr(const type_t *type) diff --git a/tools/widl/widltypes.h b/tools/widl/widltypes.h index 31a0cc74dd..6ab419b30e 100644 --- a/tools/widl/widltypes.h +++ b/tools/widl/widltypes.h @@ -364,7 +364,7 @@ struct array_details { expr_t *size_is; expr_t *length_is; - struct _type_t *elem; + struct _decl_spec_t elem; unsigned int dim; unsigned char ptr_def_fc; unsigned char declptr; /* if declared as a pointer */ diff --git a/tools/widl/write_msft.c b/tools/widl/write_msft.c index 7738cae729..ff3a63bf46 100644 --- a/tools/widl/write_msft.c +++ b/tools/widl/write_msft.c @@ -912,10 +912,10 @@ static int encode_type( case VT_SAFEARRAY: { - type_t *element_type = type_alias_get_aliasee(type_array_get_element(type)); + type_t *element_type = type_alias_get_aliasee(type_array_get_element_type(type)); int next_vt = get_type_vt(element_type); - encode_type(typelib, next_vt, type_alias_get_aliasee(type_array_get_element(type)), + encode_type(typelib, next_vt, type_alias_get_aliasee(type_array_get_element_type(type)), &target_type, &child_size); for (typeoffset = 0; typeoffset < typelib->typelib_segdir[MSFT_SEG_TYPEDESC].length; typeoffset += 8) { @@ -1056,7 +1056,7 @@ static int encode_var( num_dims = 0; for (atype = type; is_array(atype) && !type_array_is_decl_as_ptr(atype); - atype = type_array_get_element(atype)) + atype = type_array_get_element_type(atype)) ++num_dims; chat("array with %d dimensions\n", num_dims); @@ -1071,7 +1071,7 @@ static int encode_var( arraydata += 2; for (atype = type; is_array(atype) && !type_array_is_decl_as_ptr(atype); - atype = type_array_get_element(atype)) + atype = type_array_get_element_type(atype)) { arraydata[0] = type_array_get_dim(atype); arraydata[1] = 0; @@ -1093,7 +1093,7 @@ static int encode_var( vt = get_type_vt(type); if (vt == VT_PTR) { type_t *ref = is_ptr(type) ? - type_pointer_get_ref(type) : type_array_get_element(type); + type_pointer_get_ref(type) : type_array_get_element_type(type); int skip_ptr = encode_var(typelib, ref, var, &target_type, &child_size); if(skip_ptr == 2) { @@ -1114,7 +1114,7 @@ static int encode_var( if (target_type & 0x80000000) { mix_field = ((target_type >> 16) & 0x3fff) | VT_BYREF; } else if (get_type_vt(ref) == VT_SAFEARRAY) { - type_t *element_type = type_alias_get_aliasee(type_array_get_element(ref)); + type_t *element_type = type_alias_get_aliasee(type_array_get_element_type(ref)); mix_field = get_type_vt(element_type) | VT_ARRAY | VT_BYREF; } else { typedata = (void *)&typelib->typelib_segment_data[MSFT_SEG_TYPEDESC][target_type]; -- 2.17.1