widl: Use typegen_detect_type to determine which types should be written for the pointer description in write_struct_tfs.

Otherwise extra pointers for user types could be written.
This commit is contained in:
Rob Shearman 2010-03-15 19:30:02 +00:00 committed by Alexandre Julliard
parent 06e7eb5c98
commit 1d1d49b6ab
1 changed files with 18 additions and 12 deletions

View File

@ -2417,27 +2417,33 @@ static unsigned int write_struct_tfs(FILE *file, type_t *type,
if (fields) LIST_FOR_EACH_ENTRY(f, fields, const var_t, entry) if (fields) LIST_FOR_EACH_ENTRY(f, fields, const var_t, entry)
{ {
type_t *ft = f->type; type_t *ft = f->type;
if (is_ptr(ft)) switch (typegen_detect_type(ft, f->attrs, TDT_IGNORE_STRINGS))
{ {
case TGT_POINTER:
if (is_string_type(f->attrs, ft)) if (is_string_type(f->attrs, ft))
write_string_tfs(file, f->attrs, ft, FALSE, f->name, tfsoff); write_string_tfs(file, f->attrs, ft, FALSE, f->name, tfsoff);
else else
write_pointer_tfs(file, f->attrs, ft, write_pointer_tfs(file, f->attrs, ft,
type_pointer_get_ref(ft)->typestring_offset, type_pointer_get_ref(ft)->typestring_offset,
FALSE, tfsoff); FALSE, tfsoff);
} break;
else if (type_get_type(ft) == TYPE_ARRAY && type_array_is_decl_as_ptr(ft)) case TGT_ARRAY:
{ if (type_array_is_decl_as_ptr(ft))
unsigned int offset; {
unsigned int offset;
print_file(file, 0, "/* %d */\n", *tfsoff); print_file(file, 0, "/* %d */\n", *tfsoff);
offset = ft->typestring_offset; offset = ft->typestring_offset;
/* skip over the pointer that is written for strings, since a /* skip over the pointer that is written for strings, since a
* pointer has to be written in-place here */ * pointer has to be written in-place here */
if (is_string_type(f->attrs, ft)) if (is_string_type(f->attrs, ft))
offset += 4; offset += 4;
write_nonsimple_pointer(file, f->attrs, ft, FALSE, offset, tfsoff); write_nonsimple_pointer(file, f->attrs, ft, FALSE, offset, tfsoff);
}
break;
default:
break;
} }
} }
if (type->ptrdesc == *tfsoff) if (type->ptrdesc == *tfsoff)