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