widl: Convert assign_stub_out_args to using typegen_detect_type and fix the non-conformant array case.

This commit is contained in:
Rob Shearman 2010-03-23 13:33:08 +00:00 committed by Alexandre Julliard
parent f6b53be0d9
commit 0ec617e01d
1 changed files with 26 additions and 20 deletions

View File

@ -3900,33 +3900,36 @@ void assign_stub_out_args( FILE *file, int indent, const var_t *func, const char
{ {
print_file(file, indent, "%s%s", local_var_prefix, var->name); print_file(file, indent, "%s%s", local_var_prefix, var->name);
if (is_context_handle(var->type)) switch (typegen_detect_type(var->type, var->attrs, TDT_IGNORE_STRINGS))
{ {
case TGT_CTXT_HANDLE_POINTER:
fprintf(file, " = NdrContextHandleInitialize(\n"); fprintf(file, " = NdrContextHandleInitialize(\n");
print_file(file, indent + 1, "&__frame->_StubMsg,\n"); print_file(file, indent + 1, "&__frame->_StubMsg,\n");
print_file(file, indent + 1, "(PFORMAT_STRING)&__MIDL_TypeFormatString.Format[%d]);\n", print_file(file, indent + 1, "(PFORMAT_STRING)&__MIDL_TypeFormatString.Format[%d]);\n",
var->type->typestring_offset); var->type->typestring_offset);
} break;
else if (is_array(var->type) && case TGT_ARRAY:
type_array_has_conformance(var->type)) if (type_array_has_conformance(var->type))
{
unsigned int size, align = 0;
type_t *type = var->type;
fprintf(file, " = NdrAllocate(&__frame->_StubMsg, ");
for ( ;
is_array(type) && type_array_has_conformance(type);
type = type_array_get_element(type))
{ {
write_expr(file, type_array_get_conformance(type), TRUE, unsigned int size, align = 0;
TRUE, NULL, NULL, local_var_prefix); type_t *type = var->type;
fprintf(file, " * ");
fprintf(file, " = NdrAllocate(&__frame->_StubMsg, ");
for ( ;
is_array(type) && type_array_has_conformance(type);
type = type_array_get_element(type))
{
write_expr(file, type_array_get_conformance(type), TRUE,
TRUE, NULL, NULL, local_var_prefix);
fprintf(file, " * ");
}
size = type_memsize(type, &align);
fprintf(file, "%u);\n", size);
} }
size = type_memsize(type, &align); else
fprintf(file, "%u);\n", size); fprintf(file, " = &%s_W%u;\n", local_var_prefix, i++);
} break;
else case TGT_POINTER:
{
fprintf(file, " = &%s_W%u;\n", local_var_prefix, i); fprintf(file, " = &%s_W%u;\n", local_var_prefix, i);
switch (typegen_detect_type(type_pointer_get_ref(var->type), var->attrs, TDT_IGNORE_STRINGS)) switch (typegen_detect_type(type_pointer_get_ref(var->type), var->attrs, TDT_IGNORE_STRINGS))
{ {
@ -3949,6 +3952,9 @@ void assign_stub_out_args( FILE *file, int indent, const var_t *func, const char
break; break;
} }
i++; i++;
break;
default:
break;
} }
sep = 1; sep = 1;