widl: Output server code for freeing returned types.
This commit is contained in:
parent
23673ca373
commit
f170f9b5d5
|
@ -80,6 +80,9 @@ static void write_function_stubs(type_t *iface, unsigned int *proc_offset)
|
||||||
indent++;
|
indent++;
|
||||||
write_remoting_arguments(server, indent, func, "__frame->", PASS_OUT, PHASE_FREE);
|
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)
|
if (has_full_pointer)
|
||||||
write_full_pointer_free(server, indent, func);
|
write_full_pointer_free(server, indent, func);
|
||||||
|
|
||||||
|
|
|
@ -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 ||
|
if (phase == PHASE_FREE || pass == PASS_RETURN ||
|
||||||
pointer_type != RPC_FC_RP)
|
pointer_type != RPC_FC_RP)
|
||||||
{
|
{
|
||||||
unsigned int ptr_start_offset = (start_offset - (is_conformant_array(type) ? 4 : 2));
|
/* strings returned are assumed to be global and hence don't
|
||||||
print_phase_function(file, indent, "Pointer", local_var_prefix,
|
* need freeing */
|
||||||
phase, var, ptr_start_offset);
|
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
|
else
|
||||||
{
|
{
|
||||||
|
@ -3493,6 +3498,13 @@ static void write_remoting_arg(FILE *file, int indent, const var_t *func, const
|
||||||
* need a freeing pass */
|
* need a freeing pass */
|
||||||
if (phase == PHASE_MARSHAL || phase == PHASE_UNMARSHAL)
|
if (phase == PHASE_MARSHAL || phase == PHASE_UNMARSHAL)
|
||||||
struct_type = "SimpleStruct";
|
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;
|
break;
|
||||||
case RPC_FC_PSTRUCT:
|
case RPC_FC_PSTRUCT:
|
||||||
struct_type = "SimpleStruct";
|
struct_type = "SimpleStruct";
|
||||||
|
|
Loading…
Reference in New Issue