widl: Output code for initialising and freeing full pointer translation tables.
This commit is contained in:
parent
454e489c2f
commit
661b01f922
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue