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:
parent
06e7eb5c98
commit
1d1d49b6ab
|
@ -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)
|
||||||
|
|
Loading…
Reference in New Issue