Rob Shearman : widl: Output server code for freeing returned types.

Alexandre Julliard julliard at winehq.org
Mon Mar 9 09:40:36 CDT 2009


Module: wine
Branch: master
Commit: f170f9b5d517f7c4da1949e7c5f230f10bb931f4
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=f170f9b5d517f7c4da1949e7c5f230f10bb931f4

Author: Rob Shearman <robertshearman at gmail.com>
Date:   Sat Mar  7 23:23:48 2009 +0000

widl: Output server code for freeing returned types.

---

 tools/widl/server.c  |    3 +++
 tools/widl/typegen.c |   18 +++++++++++++++---
 2 files changed, 18 insertions(+), 3 deletions(-)

diff --git a/tools/widl/server.c b/tools/widl/server.c
index bfec342..fd64899 100644
--- a/tools/widl/server.c
+++ b/tools/widl/server.c
@@ -80,6 +80,9 @@ static void write_function_stubs(type_t *iface, unsigned int *proc_offset)
         indent++;
         write_remoting_arguments(server, indent, func, "__frame->", PASS_OUT, PHASE_FREE);
 
+        if (!is_void(type_function_get_rettype(func->type)))
+            write_remoting_arguments(server, indent, func, "__frame->", PASS_RETURN, PHASE_FREE);
+
         if (has_full_pointer)
             write_full_pointer_free(server, indent, func);
 
diff --git a/tools/widl/typegen.c b/tools/widl/typegen.c
index 5a53fb4..ca22825 100644
--- a/tools/widl/typegen.c
+++ b/tools/widl/typegen.c
@@ -3349,9 +3349,14 @@ static void write_remoting_arg(FILE *file, int indent, const var_t *func, const
         if (phase == PHASE_FREE || pass == PASS_RETURN ||
             pointer_type != RPC_FC_RP)
         {
-            unsigned int ptr_start_offset = (start_offset - (is_conformant_array(type) ? 4 : 2));
-            print_phase_function(file, indent, "Pointer", local_var_prefix,
-                                 phase, var, ptr_start_offset);
+            /* strings returned are assumed to be global and hence don't
+             * need freeing */
+            if (phase != PHASE_FREE || pass != PASS_RETURN)
+            {
+                unsigned int ptr_start_offset = (start_offset - (is_conformant_array(type) ? 4 : 2));
+                print_phase_function(file, indent, "Pointer", local_var_prefix,
+                                     phase, var, ptr_start_offset);
+            }
         }
         else
         {
@@ -3493,6 +3498,13 @@ static void write_remoting_arg(FILE *file, int indent, const var_t *func, const
                  * need a freeing pass */
                 if (phase == PHASE_MARSHAL || phase == PHASE_UNMARSHAL)
                     struct_type = "SimpleStruct";
+                else if (phase == PHASE_FREE && pass == PASS_RETURN)
+                {
+                    print_file(file, indent, "if (%s%s)\n", local_var_prefix, var->name);
+                    indent++;
+                    print_file(file, indent, "__frame->_StubMsg.pfnFree(%s%s);\n", local_var_prefix, var->name);
+                    indent--;
+                }
                 break;
             case RPC_FC_PSTRUCT:
                 struct_type = "SimpleStruct";




More information about the wine-cvs mailing list