Commit 661b01f9 authored by Rob Shearman's avatar Rob Shearman Committed by Alexandre Julliard

widl: Output code for initialising and freeing full pointer translation tables.

parent 454e489c
......@@ -85,6 +85,7 @@ static void write_function_stubs(type_t *iface, unsigned int *proc_offset)
{
const var_t *def = func->def;
const var_t* explicit_handle_var;
int has_full_pointer = is_full_pointer_function(func);
/* check for a defined binding handle */
explicit_handle_var = get_explicit_handle_var(func);
......@@ -142,6 +143,9 @@ static void write_function_stubs(type_t *iface, unsigned int *proc_offset)
}
fprintf(client, "\n");
if (has_full_pointer)
write_full_pointer_init(client, indent, func, FALSE);
/* check pointers */
check_pointers(func);
......@@ -245,6 +249,9 @@ static void write_function_stubs(type_t *iface, unsigned int *proc_offset)
/* FIXME: emit client finally code */
if (has_full_pointer)
write_full_pointer_free(client, indent, func);
print_client("NdrFreeBuffer((PMIDL_STUB_MESSAGE)&_StubMsg);\n");
indent--;
......
......@@ -254,6 +254,7 @@ static void gen_proxy(type_t *iface, const func_t *cur, int idx,
{
var_t *def = cur->def;
int has_ret = !is_void(def->type);
int has_full_pointer = is_full_pointer_function(cur);
indent = 0;
write_type_decl_left(proxy, def->type);
......@@ -279,6 +280,9 @@ static void gen_proxy(type_t *iface, const func_t *cur, int idx,
}
print_proxy( "\n");
if (has_full_pointer)
write_full_pointer_init(proxy, indent, cur, FALSE);
/* FIXME: trace */
clear_output_vars( cur->args );
......@@ -325,6 +329,8 @@ static void gen_proxy(type_t *iface, const func_t *cur, int idx,
print_proxy( "RpcFinally\n" );
print_proxy( "{\n" );
indent++;
if (has_full_pointer)
write_full_pointer_free(proxy, indent, cur);
print_proxy( "NdrProxyFreeBuffer(This, &_StubMsg);\n" );
indent--;
print_proxy( "}\n");
......@@ -356,6 +362,7 @@ static void gen_stub(type_t *iface, const func_t *cur, const char *cas,
var_t *def = cur->def;
const var_t *arg;
int has_ret = !is_void(def->type);
int has_full_pointer = is_full_pointer_function(cur);
indent = 0;
print_proxy( "void __RPC_STUB %s_", iface->name);
......@@ -384,6 +391,8 @@ static void gen_stub(type_t *iface, const func_t *cur, const char *cas,
print_proxy("RpcTryFinally\n");
print_proxy("{\n");
indent++;
if (has_full_pointer)
write_full_pointer_init(proxy, indent, cur, TRUE);
print_proxy("if ((_pRpcMessage->DataRepresentation & 0xffff) != NDR_LOCAL_DATA_REPRESENTATION)\n");
indent++;
print_proxy("NdrConvert( &_StubMsg, &__MIDL_ProcFormatString.Format[%u]);\n", proc_offset );
......@@ -439,6 +448,9 @@ static void gen_stub(type_t *iface, const func_t *cur, const char *cas,
write_remoting_arguments(proxy, indent+1, cur, PASS_OUT, PHASE_FREE);
if (has_full_pointer)
write_full_pointer_free(proxy, indent, cur);
print_proxy("}\n");
print_proxy("RpcEndFinally\n");
......
......@@ -62,6 +62,7 @@ static void write_function_stubs(type_t *iface, unsigned int *proc_offset)
LIST_FOR_EACH_ENTRY( func, iface->funcs, const func_t, entry )
{
const var_t *def = func->def;
int has_full_pointer = is_full_pointer_function(func);
/* check for a defined binding handle */
explicit_handle_var = get_explicit_handle_var(func);
......@@ -126,6 +127,9 @@ static void write_function_stubs(type_t *iface, unsigned int *proc_offset)
print_server("{\n");
indent++;
if (has_full_pointer)
write_full_pointer_init(server, indent, func, TRUE);
if (func->args)
{
print_server("if ((_pRpcMessage->DataRepresentation & 0x0000FFFFUL) != NDR_LOCAL_DATA_REPRESENTATION)\n");
......@@ -236,6 +240,9 @@ static void write_function_stubs(type_t *iface, unsigned int *proc_offset)
write_remoting_arguments(server, indent, func, PASS_OUT, PHASE_FREE);
if (has_full_pointer)
write_full_pointer_free(server, indent, func);
indent--;
print_server("}\n");
print_server("RpcEndFinally\n");
......
......@@ -193,6 +193,46 @@ static int type_has_pointers(const type_t *type)
return FALSE;
}
static int type_has_full_pointer(const type_t *type)
{
if (is_user_type(type))
return FALSE;
else if (type->type == RPC_FC_FP)
return TRUE;
else if (is_ptr(type))
return FALSE;
else if (is_array(type))
return type_has_full_pointer(type->ref);
else if (is_struct(type->type))
{
const var_t *field;
if (type->fields) LIST_FOR_EACH_ENTRY( field, type->fields, const var_t, entry )
{
if (type_has_full_pointer(field->type))
return TRUE;
}
}
else if (is_union(type->type))
{
var_list_t *fields;
const var_t *field;
if (type->type == RPC_FC_ENCAPSULATED_UNION)
{
const var_t *uv = LIST_ENTRY(list_tail(type->fields), const var_t, entry);
fields = uv->type->fields;
}
else
fields = type->fields;
if (fields) LIST_FOR_EACH_ENTRY( field, fields, const var_t, entry )
{
if (field->type && type_has_full_pointer(field->type))
return TRUE;
}
}
return FALSE;
}
static unsigned short user_type_offset(const char *name)
{
user_type_t *ut;
......@@ -903,6 +943,32 @@ size_t type_memsize(const type_t *t, unsigned int *align)
return size;
}
int is_full_pointer_function(const func_t *func)
{
const var_t *var;
if (type_has_full_pointer(func->def->type))
return TRUE;
if (!func->args)
return FALSE;
LIST_FOR_EACH_ENTRY( var, func->args, const var_t, entry )
if (type_has_full_pointer( var->type ))
return TRUE;
return FALSE;
}
void write_full_pointer_init(FILE *file, int indent, const func_t *func, int is_server)
{
print_file(file, indent, "_StubMsg.FullPtrXlatTables = NdrFullPointerXlatInit(0,%s);\n",
is_server ? "XLAT_SERVER" : "XLAT_CLIENT");
fprintf(file, "\n");
}
void write_full_pointer_free(FILE *file, int indent, const func_t *func)
{
print_file(file, indent, "NdrFullPointerXlatFree(_StubMsg.FullPtrXlatTables);\n");
fprintf(file, "\n");
}
static unsigned int write_nonsimple_pointer(FILE *file, const type_t *type, size_t offset)
{
short absoff = type->ref->typestring_offset;
......
......@@ -60,3 +60,6 @@ void print(FILE *file, int indent, const char *format, va_list ap);
int get_padding(const var_list_t *fields);
int is_user_type(const type_t *t);
expr_t *get_size_is_expr(const type_t *t, const char *name);
int is_full_pointer_function(const func_t *func);
void write_full_pointer_init(FILE *file, int indent, const func_t *func, int is_server);
void write_full_pointer_free(FILE *file, int indent, const func_t *func);
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment