1
0
mirror of https://github.com/wine-mirror/wine synced 2024-07-08 20:06:18 +00:00

widl: Move declarray property to array_details.

Invert the property since an array being declared as a pointer is more
surprising than an array being declared as an array.

Provide an accessor, type_array_is_decl_as_ptr.
This commit is contained in:
Rob Shearman 2009-03-05 08:21:35 +00:00 committed by Alexandre Julliard
parent 3db77ce50b
commit 7e08ff27c2
11 changed files with 57 additions and 41 deletions

View File

@ -498,7 +498,7 @@ static struct expression_type resolve_expression(const struct expr_loc *expr_loc
if (result.type && is_ptr(result.type)) if (result.type && is_ptr(result.type))
result.type = type_pointer_get_ref(result.type); result.type = type_pointer_get_ref(result.type);
else if(result.type && is_array(result.type) else if(result.type && is_array(result.type)
&& !result.type->declarray) && type_array_is_decl_as_ptr(result.type))
result.type = type_array_get_element(result.type); result.type = type_array_get_element(result.type);
else else
error_loc_info(&expr_loc->v->loc_info, "dereference operator applied to non-pointer type in expression%s%s\n", error_loc_info(&expr_loc->v->loc_info, "dereference operator applied to non-pointer type in expression%s%s\n",

View File

@ -183,7 +183,7 @@ static void write_enums(FILE *h, var_list_t *enums)
int needs_space_after(type_t *t) int needs_space_after(type_t *t)
{ {
return (type_is_alias(t) || return (type_is_alias(t) ||
(!is_ptr(t) && (!is_conformant_array(t) || t->declarray || (is_array(t) && t->name)))); (!is_ptr(t) && (!is_conformant_array(t) || !type_array_is_decl_as_ptr(t) || t->name)));
} }
void write_type_left(FILE *h, type_t *t, int declonly) void write_type_left(FILE *h, type_t *t, int declonly)
@ -191,11 +191,10 @@ void write_type_left(FILE *h, type_t *t, int declonly)
if (!h) return; if (!h) return;
if (is_attr(t->attrs, ATTR_CONST) && if (is_attr(t->attrs, ATTR_CONST) &&
(type_is_alias(t) || t->declarray || !is_ptr(t))) (type_is_alias(t) || !is_ptr(t)))
fprintf(h, "const "); fprintf(h, "const ");
if (type_is_alias(t)) fprintf(h, "%s", t->name); if (type_is_alias(t)) fprintf(h, "%s", t->name);
else if (t->declarray) write_type_left(h, type_array_get_element(t), declonly);
else { else {
switch (type_get_type_detect_alias(t)) { switch (type_get_type_detect_alias(t)) {
case TYPE_ENUM: case TYPE_ENUM:
@ -244,12 +243,13 @@ void write_type_left(FILE *h, type_t *t, int declonly)
if (is_attr(t->attrs, ATTR_CONST)) fprintf(h, "const "); if (is_attr(t->attrs, ATTR_CONST)) fprintf(h, "const ");
break; break;
case TYPE_ARRAY: case TYPE_ARRAY:
if (t->name) if (t->name && type_array_is_decl_as_ptr(t))
fprintf(h, "%s", t->name); fprintf(h, "%s", t->name);
else else
{ {
write_type_left(h, type_array_get_element(t), declonly); write_type_left(h, type_array_get_element(t), declonly);
fprintf(h, "%s*", needs_space_after(type_array_get_element(t)) ? " " : ""); if (type_array_is_decl_as_ptr(t))
fprintf(h, "%s*", needs_space_after(type_array_get_element(t)) ? " " : "");
} }
break; break;
case TYPE_BASIC: case TYPE_BASIC:
@ -275,12 +275,14 @@ void write_type_right(FILE *h, type_t *t, int is_field)
{ {
if (!h) return; if (!h) return;
if (t->declarray) { if (type_get_type(t) == TYPE_ARRAY && !type_array_is_decl_as_ptr(t)) {
if (is_conformant_array(t)) { if (is_conformant_array(t)) {
fprintf(h, "[%s]", is_field ? "1" : ""); fprintf(h, "[%s]", is_field ? "1" : "");
t = type_array_get_element(t); t = type_array_get_element(t);
} }
for ( ; t->declarray; t = type_array_get_element(t)) for ( ;
type_get_type(t) == TYPE_ARRAY && !type_array_is_decl_as_ptr(t);
t = type_array_get_element(t))
fprintf(h, "[%u]", type_array_get_dim(t)); fprintf(h, "[%u]", type_array_get_dim(t));
} }
} }

View File

@ -1294,7 +1294,6 @@ type_t *make_type(unsigned char type, type_t *ref)
memset(&t->details, 0, sizeof(t->details)); memset(&t->details, 0, sizeof(t->details));
t->typestring_offset = 0; t->typestring_offset = 0;
t->ptrdesc = 0; t->ptrdesc = 0;
t->declarray = FALSE;
t->ignore = (parse_only != 0); t->ignore = (parse_only != 0);
t->sign = 0; t->sign = 0;
t->defined = FALSE; t->defined = FALSE;
@ -1506,7 +1505,7 @@ static void set_type(var_t *v, decl_spec_t *decl_spec, const declarator_t *decl,
else else
sizeless = TRUE; sizeless = TRUE;
*ptype = type_new_array(NULL, *ptype, TRUE, *ptype = type_new_array(NULL, *ptype, FALSE,
dim->is_const ? dim->cval : 0, dim->is_const ? dim->cval : 0,
dim->is_const ? NULL : dim, NULL); dim->is_const ? NULL : dim, NULL);
} }
@ -1522,11 +1521,11 @@ static void set_type(var_t *v, decl_spec_t *decl_spec, const declarator_t *decl,
error_loc("%s: cannot specify size_is for a fixed sized array\n", v->name); error_loc("%s: cannot specify size_is for a fixed sized array\n", v->name);
else else
*ptype = type_new_array((*ptype)->name, *ptype = type_new_array((*ptype)->name,
type_array_get_element(*ptype), TRUE, type_array_get_element(*ptype), FALSE,
0, dim, NULL); 0, dim, NULL);
} }
else if (is_ptr(*ptype)) else if (is_ptr(*ptype))
*ptype = type_new_array((*ptype)->name, type_pointer_get_ref(*ptype), FALSE, *ptype = type_new_array((*ptype)->name, type_pointer_get_ref(*ptype), TRUE,
0, dim, NULL); 0, dim, NULL);
else else
error_loc("%s: size_is attribute applied to illegal type\n", v->name); error_loc("%s: size_is attribute applied to illegal type\n", v->name);
@ -1546,7 +1545,7 @@ static void set_type(var_t *v, decl_spec_t *decl_spec, const declarator_t *decl,
{ {
*ptype = type_new_array((*ptype)->name, *ptype = type_new_array((*ptype)->name,
type_array_get_element(*ptype), type_array_get_element(*ptype),
(*ptype)->declarray, type_array_is_decl_as_ptr(*ptype),
type_array_get_dim(*ptype), type_array_get_dim(*ptype),
type_array_get_conformance(*ptype), type_array_get_conformance(*ptype),
dim); dim);

View File

@ -468,7 +468,7 @@ static void gen_stub(type_t *iface, const var_t *func, const char *cas,
if (type_get_function_args(func->type)) if (type_get_function_args(func->type))
{ {
LIST_FOR_EACH_ENTRY( arg, type_get_function_args(func->type), const var_t, entry ) LIST_FOR_EACH_ENTRY( arg, type_get_function_args(func->type), const var_t, entry )
fprintf(proxy, ", %s__frame->%s", arg->type->declarray ? "*" : "", arg->name); fprintf(proxy, ", %s__frame->%s", is_array(arg->type) && !type_array_is_decl_as_ptr(arg->type) ? "*" :"" , arg->name);
} }
fprintf(proxy, ");\n"); fprintf(proxy, ");\n");
fprintf(proxy, "\n"); fprintf(proxy, "\n");

View File

@ -185,7 +185,7 @@ static void write_function_stubs(type_t *iface, unsigned int *proc_offset)
} }
else else
{ {
print_server("%s__frame->%s", var->type->declarray ? "*" : "", var->name); print_server("%s__frame->%s", is_array(var->type) && !type_array_is_decl_as_ptr(var->type) ? "*" : "", var->name);
} }
} }
fprintf(server, ");\n"); fprintf(server, ");\n");

View File

@ -201,7 +201,7 @@ unsigned char get_struct_fc(const type_t *type)
typegen_type = typegen_detect_type(t, field->attrs, TDT_IGNORE_STRINGS); typegen_type = typegen_detect_type(t, field->attrs, TDT_IGNORE_STRINGS);
if (typegen_type == TGT_ARRAY && t->declarray) if (typegen_type == TGT_ARRAY && !type_array_is_decl_as_ptr(t))
{ {
if (is_string_type(field->attrs, field->type)) if (is_string_type(field->attrs, field->type))
{ {
@ -885,7 +885,7 @@ static unsigned int write_conf_or_var_desc(FILE *file, const type_t *structure,
return 4; return 4;
} }
if (is_ptr(type) || (is_array(type) && !type->declarray)) if (is_ptr(type) || (is_array(type) && type_array_is_decl_as_ptr(type)))
{ {
conftype = RPC_FC_POINTER_CONFORMANCE; conftype = RPC_FC_POINTER_CONFORMANCE;
conftype_string = "field pointer, "; conftype_string = "field pointer, ";
@ -1185,7 +1185,7 @@ unsigned int type_memsize(const type_t *t, unsigned int *align)
if (size > *align) *align = size; if (size > *align) *align = size;
break; break;
case TYPE_ARRAY: case TYPE_ARRAY:
if (t->declarray) if (!type_array_is_decl_as_ptr(t))
{ {
if (is_conformant_array(t)) if (is_conformant_array(t))
{ {
@ -1478,7 +1478,8 @@ static int write_no_repeat_pointer_descriptions(
int written = 0; int written = 0;
unsigned int align; unsigned int align;
if (is_ptr(type) || (!type->declarray && is_conformant_array(type))) if (is_ptr(type) ||
(is_conformant_array(type) && type_array_is_decl_as_ptr(type)))
{ {
unsigned int memsize; unsigned int memsize;
@ -1864,7 +1865,8 @@ static void write_pointer_description(FILE *file, type_t *type,
/* pass 3: search for pointers in conformant only arrays (but don't descend /* pass 3: search for pointers in conformant only arrays (but don't descend
* into conformant varying or varying arrays) */ * into conformant varying or varying arrays) */
if ((!type->declarray || !current_structure) && is_conformant_array(type)) if (is_conformant_array(type) &&
(type_array_is_decl_as_ptr(type) || !current_structure))
write_conformant_array_pointer_descriptions( write_conformant_array_pointer_descriptions(
file, NULL, type, 0, typestring_offset); file, NULL, type, 0, typestring_offset);
else if (type_get_type(type) == TYPE_STRUCT && else if (type_get_type(type) == TYPE_STRUCT &&
@ -1888,7 +1890,7 @@ static void write_pointer_description(FILE *file, type_t *type,
int is_declptr(const type_t *t) int is_declptr(const type_t *t)
{ {
return is_ptr(t) || (is_conformant_array(t) && !t->declarray); return is_ptr(t) || (type_get_type(t) == TYPE_ARRAY && type_array_is_decl_as_ptr(t));
} }
static unsigned int write_string_tfs(FILE *file, const attr_list_t *attrs, static unsigned int write_string_tfs(FILE *file, const attr_list_t *attrs,
@ -1938,7 +1940,7 @@ static unsigned int write_string_tfs(FILE *file, const attr_list_t *attrs,
return start_offset; return start_offset;
} }
if (type->declarray && !is_conformant_array(type)) if (type_get_type(type) == TYPE_ARRAY && !type_array_has_conformance(type))
{ {
unsigned int dim = type_array_get_dim(type); unsigned int dim = type_array_get_dim(type);
@ -1972,7 +1974,7 @@ static unsigned int write_string_tfs(FILE *file, const attr_list_t *attrs,
*typestring_offset += write_conf_or_var_desc( *typestring_offset += write_conf_or_var_desc(
file, current_structure, file, current_structure,
(type->declarray && current_structure (!type_array_is_decl_as_ptr(type) && current_structure
? type_memsize(current_structure, &align) ? type_memsize(current_structure, &align)
: 0), : 0),
type, type_array_get_conformance(type)); type, type_array_get_conformance(type));
@ -2004,7 +2006,7 @@ static unsigned int write_array_tfs(FILE *file, const attr_list_t *attrs, type_t
int has_pointer; int has_pointer;
int pointer_type = get_attrv(attrs, ATTR_POINTERTYPE); int pointer_type = get_attrv(attrs, ATTR_POINTERTYPE);
unsigned int baseoff unsigned int baseoff
= type->declarray && current_structure = !type_array_is_decl_as_ptr(type) && current_structure
? type_memsize(current_structure, &align) ? type_memsize(current_structure, &align)
: 0; : 0;
@ -2072,7 +2074,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, += write_conf_or_var_desc(file, current_structure, baseoff,
type, length_is); type, length_is);
if (has_pointer && (!type->declarray || !current_structure)) if (has_pointer && (type_array_is_decl_as_ptr(type) || !current_structure))
{ {
print_file(file, 2, "0x%x, /* FC_PP */\n", RPC_FC_PP); print_file(file, 2, "0x%x, /* FC_PP */\n", RPC_FC_PP);
print_file(file, 2, "0x%x, /* FC_PAD */\n", RPC_FC_PAD); print_file(file, 2, "0x%x, /* FC_PAD */\n", RPC_FC_PAD);
@ -2115,7 +2117,7 @@ static const var_t *find_array_or_string_in_struct(const type_t *type)
last_field = LIST_ENTRY( list_tail(fields), const var_t, entry ); last_field = LIST_ENTRY( list_tail(fields), const var_t, entry );
ft = last_field->type; ft = last_field->type;
if (ft->declarray && is_conformant_array(ft)) if (is_conformant_array(ft) && !type_array_is_decl_as_ptr(ft))
return last_field; return last_field;
if (type_get_type(ft) == TYPE_STRUCT) if (type_get_type(ft) == TYPE_STRUCT)
@ -2137,7 +2139,7 @@ static void write_struct_members(FILE *file, const type_t *type,
if (fields) LIST_FOR_EACH_ENTRY( field, fields, const var_t, entry ) if (fields) LIST_FOR_EACH_ENTRY( field, fields, const var_t, entry )
{ {
type_t *ft = field->type; type_t *ft = field->type;
if (!ft->declarray || !is_conformant_array(ft)) if (!is_conformant_array(ft) || type_array_is_decl_as_ptr(ft))
{ {
unsigned int align = 0; unsigned int align = 0;
unsigned int size = type_memsize(ft, &align); unsigned int size = type_memsize(ft, &align);
@ -2282,7 +2284,7 @@ static unsigned int write_struct_tfs(FILE *file, type_t *type,
else else
write_pointer_tfs(file, ft, tfsoff); write_pointer_tfs(file, ft, tfsoff);
} }
else if (!ft->declarray && is_conformant_array(ft)) else if (type_get_type(ft) == TYPE_ARRAY && type_array_is_decl_as_ptr(ft))
{ {
unsigned int absoff = ft->typestring_offset; unsigned int absoff = ft->typestring_offset;
short reloff = absoff - (*tfsoff + 2); short reloff = absoff - (*tfsoff + 2);
@ -2752,7 +2754,7 @@ static int write_embedded_types(FILE *file, const attr_list_t *attrs, type_t *ty
} }
case TGT_ARRAY: case TGT_ARRAY:
/* conformant arrays and strings are handled specially */ /* conformant arrays and strings are handled specially */
if (!type->declarray || !is_conformant_array(type)) if (!is_conformant_array(type) || type_array_is_decl_as_ptr(type) )
{ {
write_array_tfs(file, attrs, type, name, tfsoff); write_array_tfs(file, attrs, type, name, tfsoff);
if (is_conformant_array(type)) if (is_conformant_array(type))
@ -3695,7 +3697,8 @@ void declare_stub_args( FILE *file, int indent, const var_t *func )
type_t *type_to_print; type_t *type_to_print;
char name[16]; char name[16];
print_file(file, indent, "%s", ""); print_file(file, indent, "%s", "");
if (var->type->declarray) if (type_get_type(var->type) == TYPE_ARRAY &&
!type_array_is_decl_as_ptr(var->type))
type_to_print = var->type; type_to_print = var->type;
else else
type_to_print = type_pointer_get_ref(var->type); type_to_print = type_pointer_get_ref(var->type);
@ -3707,7 +3710,8 @@ void declare_stub_args( FILE *file, int indent, const var_t *func )
print_file(file, indent, "%s", ""); print_file(file, indent, "%s", "");
write_type_decl_left(file, var->type); write_type_decl_left(file, var->type);
fprintf(file, " "); fprintf(file, " ");
if (var->type->declarray) { if (type_get_type(var->type) == TYPE_ARRAY &&
!type_array_is_decl_as_ptr(var->type)) {
fprintf(file, "(*%s)", var->name); fprintf(file, "(*%s)", var->name);
} else } else
fprintf(file, "%s", var->name); fprintf(file, "%s", var->name);

View File

@ -186,7 +186,7 @@ unsigned short get_type_vt(type_t *t)
return VT_PTR; return VT_PTR;
case TYPE_ARRAY: case TYPE_ARRAY:
if (t->declarray) if (!type_array_is_decl_as_ptr(t))
error("get_type_vt: array types not supported\n"); error("get_type_vt: array types not supported\n");
return VT_PTR; return VT_PTR;

View File

@ -63,7 +63,6 @@ type_t *type_new_alias(type_t *t, const char *name)
a->name = xstrdup(name); a->name = xstrdup(name);
a->attrs = NULL; a->attrs = NULL;
a->declarray = FALSE;
a->orig = t; a->orig = t;
a->is_alias = TRUE; a->is_alias = TRUE;
init_loc_info(&a->loc_info); init_loc_info(&a->loc_info);
@ -79,12 +78,12 @@ type_t *type_new_module(char *name)
return type; return type;
} }
type_t *type_new_array(const char *name, type_t *element, int declarray, type_t *type_new_array(const char *name, type_t *element, int declptr,
unsigned int dim, expr_t *size_is, expr_t *length_is) unsigned int dim, expr_t *size_is, expr_t *length_is)
{ {
type_t *t = make_type(RPC_FC_LGFARRAY, element); type_t *t = make_type(RPC_FC_LGFARRAY, element);
if (name) t->name = xstrdup(name); if (name) t->name = xstrdup(name);
t->declarray = declarray; t->details.array.declptr = declptr;
t->details.array.length_is = length_is; t->details.array.length_is = length_is;
if (size_is) if (size_is)
t->details.array.size_is = size_is; t->details.array.size_is = size_is;

View File

@ -28,7 +28,7 @@ type_t *type_new_function(var_list_t *args);
type_t *type_new_pointer(type_t *ref, attr_list_t *attrs); type_t *type_new_pointer(type_t *ref, attr_list_t *attrs);
type_t *type_new_alias(type_t *t, const char *name); type_t *type_new_alias(type_t *t, const char *name);
type_t *type_new_module(char *name); type_t *type_new_module(char *name);
type_t *type_new_array(const char *name, type_t *element, int declarray, type_t *type_new_array(const char *name, type_t *element, int declptr,
unsigned int dim, expr_t *size_is, expr_t *length_is); unsigned int dim, expr_t *size_is, expr_t *length_is);
void type_interface_define(type_t *iface, type_t *inherit, statement_list_t *stmts); void type_interface_define(type_t *iface, type_t *inherit, statement_list_t *stmts);
void type_dispinterface_define(type_t *iface, var_list_t *props, func_list_t *methods); void type_dispinterface_define(type_t *iface, var_list_t *props, func_list_t *methods);
@ -221,6 +221,13 @@ static inline type_t *type_array_get_element(const type_t *type)
return type->ref; return type->ref;
} }
static inline int type_array_is_decl_as_ptr(const type_t *type)
{
type = type_get_real_type(type);
assert(type_get_type(type) == TYPE_ARRAY);
return type->details.array.declptr;
}
static inline int type_is_alias(const type_t *type) static inline int type_is_alias(const type_t *type)
{ {
return type->is_alias; return type->is_alias;

View File

@ -293,7 +293,9 @@ struct module_details
struct array_details struct array_details
{ {
unsigned int dim; unsigned int dim;
expr_t *size_is, *length_is; expr_t *size_is;
expr_t *length_is;
unsigned int declptr; /* if declared as a pointer */
}; };
struct coclass_details struct coclass_details
@ -338,7 +340,6 @@ struct _type_t {
unsigned int ptrdesc; /* used for complex structs */ unsigned int ptrdesc; /* used for complex structs */
int typelib_idx; int typelib_idx;
loc_info_t loc_info; loc_info_t loc_info;
unsigned int declarray : 1; /* if declared as an array */
unsigned int ignore : 1; unsigned int ignore : 1;
unsigned int defined : 1; unsigned int defined : 1;
unsigned int written : 1; unsigned int written : 1;

View File

@ -1068,13 +1068,15 @@ static int encode_var(
chat("encode_var: var %p type %p type->name %s type->ref %p\n", chat("encode_var: var %p type %p type->name %s type->ref %p\n",
var, type, type->name ? type->name : "NULL", type->ref); var, type, type->name ? type->name : "NULL", type->ref);
if (type->declarray) { if (is_array(type) && !type_array_is_decl_as_ptr(type)) {
int num_dims, elements = 1, arrayoffset; int num_dims, elements = 1, arrayoffset;
type_t *atype; type_t *atype;
int *arraydata; int *arraydata;
num_dims = 0; num_dims = 0;
for (atype = type; atype->declarray; atype = type_array_get_element(atype)) for (atype = type;
is_array(atype) && !type_array_is_decl_as_ptr(atype);
atype = type_array_get_element(atype))
++num_dims; ++num_dims;
chat("array with %d dimensions\n", num_dims); chat("array with %d dimensions\n", num_dims);
@ -1087,7 +1089,9 @@ static int encode_var(
arraydata[1] |= ((num_dims * 2 * sizeof(int)) << 16); arraydata[1] |= ((num_dims * 2 * sizeof(int)) << 16);
arraydata += 2; arraydata += 2;
for (atype = type; atype->declarray; atype = type_array_get_element(atype)) for (atype = type;
is_array(atype) && !type_array_is_decl_as_ptr(atype);
atype = type_array_get_element(atype))
{ {
arraydata[0] = type_array_get_dim(atype); arraydata[0] = type_array_get_dim(atype);
arraydata[1] = 0; arraydata[1] = 0;