Alexandre Julliard : widl: Zero-initialize [out] structures and unions that contain pointers.
Alexandre Julliard
julliard at winehq.org
Tue Dec 13 13:01:28 CST 2011
Module: wine
Branch: master
Commit: bf0c37d56a263194b229c5fd7e44ddd302b41de4
URL: http://source.winehq.org/git/wine.git/?a=commit;h=bf0c37d56a263194b229c5fd7e44ddd302b41de4
Author: Alexandre Julliard <julliard at winehq.org>
Date: Tue Dec 13 16:29:49 2011 +0100
widl: Zero-initialize [out] structures and unions that contain pointers.
---
tools/widl/typegen.c | 17 +++++++++++++++--
1 files changed, 15 insertions(+), 2 deletions(-)
diff --git a/tools/widl/typegen.c b/tools/widl/typegen.c
index c1b5302..516d8e7 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:
More information about the wine-cvs
mailing list