From bf0c37d56a263194b229c5fd7e44ddd302b41de4 Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Tue, 13 Dec 2011 16:29:49 +0100 Subject: [PATCH] widl: Zero-initialize [out] structures and unions that contain pointers. --- tools/widl/typegen.c | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/tools/widl/typegen.c b/tools/widl/typegen.c index c1b53022c97..516d8e7bbe8 100644 --- a/tools/widl/typegen.c +++ b/tools/widl/typegen.c @@ -4588,6 +4588,7 @@ void assign_stub_out_args( FILE *file, int indent, const var_t *func, const char int in_attr, out_attr; int i = 0, sep = 0; const var_t *var; + type_t *ref; if (!type_get_function_args(func->type)) return; @@ -4646,7 +4647,8 @@ void assign_stub_out_args( FILE *file, int indent, const var_t *func, const char break; case TGT_POINTER: 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)) + ref = type_pointer_get_ref(var->type); + switch (typegen_detect_type(ref, var->attrs, TDT_IGNORE_STRINGS)) { case TGT_BASIC: case TGT_ENUM: @@ -4659,9 +4661,20 @@ void assign_stub_out_args( FILE *file, int indent, const var_t *func, const char print_file(file, indent, "memset(&%s_W%u, 0, sizeof(%s_W%u));\n", local_var_prefix, i, local_var_prefix, i); break; + case TGT_ARRAY: + if (type_array_is_decl_as_ptr(ref)) + { + print_file(file, indent, "%s_W%u = 0;\n", local_var_prefix, i); + break; + } + ref = type_array_get_element(ref); + /* fall through */ case TGT_STRUCT: case TGT_UNION: - case TGT_ARRAY: + if (type_has_pointers(ref)) + print_file(file, indent, "memset(&%s_W%u, 0, sizeof(%s_W%u));\n", + local_var_prefix, i, local_var_prefix, i); + break; case TGT_CTXT_HANDLE: case TGT_CTXT_HANDLE_POINTER: case TGT_INVALID: -- 2.11.4.GIT