Module: wine Branch: master Commit: f170f9b5d517f7c4da1949e7c5f230f10bb931f4 URL: http://source.winehq.org/git/wine.git/?a=commit;h=f170f9b5d517f7c4da1949e7c5...
Author: Rob Shearman robertshearman@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";