Module: wine Branch: master Commit: 809810eb28739307a53915325eb23d76f4483eb8 URL: http://source.winehq.org/git/wine.git/?a=commit;h=809810eb28739307a53915325e...
Author: Alexandre Julliard julliard@winehq.org Date: Mon Jun 20 13:51:27 2011 +0200
widl: Use NdrPointerFree instead of freeing by hand where possible.
---
tools/widl/typegen.c | 24 ++++++++++++++++-------- 1 files changed, 16 insertions(+), 8 deletions(-)
diff --git a/tools/widl/typegen.c b/tools/widl/typegen.c index 0096c32..847e10b 100644 --- a/tools/widl/typegen.c +++ b/tools/widl/typegen.c @@ -4189,19 +4189,18 @@ 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) { - if (pointer_type == RPC_FC_RP && phase == PHASE_FREE && + /* strings returned are assumed to be global and hence don't + * need freeing */ + if (is_declptr(type) && !(phase == PHASE_FREE && pass == PASS_RETURN)) + print_phase_function(file, indent, "Pointer", local_var_prefix, + phase, var, start_offset); + else if (pointer_type == RPC_FC_RP && phase == PHASE_FREE && !in_attr && is_conformant_array(type)) { 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); } - /* strings returned are assumed to be global and hence don't - * need freeing */ - else if (is_declptr(type) && - !(phase == PHASE_FREE && pass == PASS_RETURN)) - print_phase_function(file, indent, "Pointer", local_var_prefix, - phase, var, start_offset); } else { @@ -4257,7 +4256,7 @@ static void write_remoting_arg(FILE *file, int indent, const var_t *func, const }
if (pointer_type != RPC_FC_RP) array_type = "Pointer"; - print_phase_function(file, indent, array_type, local_var_prefix, phase, var, start_offset); + if (phase == PHASE_FREE && pointer_type == RPC_FC_RP) { /* these are all unmarshalled by allocating memory */ @@ -4266,11 +4265,20 @@ static void write_remoting_arg(FILE *file, int indent, const var_t *func, const ((tc == RPC_FC_SMVARRAY || tc == RPC_FC_LGVARRAY) && in_attr) || (tc == RPC_FC_CARRAY && !in_attr)) { + if (type_array_is_decl_as_ptr(type) && type->details.array.ptr_tfsoff) + { + print_phase_function(file, indent, "Pointer", local_var_prefix, phase, var, + type->details.array.ptr_tfsoff); + break; + } + print_phase_function(file, indent, array_type, local_var_prefix, phase, var, start_offset); 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); + break; } } + print_phase_function(file, indent, array_type, local_var_prefix, phase, var, start_offset); break; } case TGT_BASIC: