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