widl: Move support for stub arguments to typegen.c to make it usable for proxies too.
This commit is contained in:
parent
7d65939825
commit
85ed9ca31a
|
@ -76,99 +76,6 @@ static void write_parameters_init(const func_t *func)
|
|||
}
|
||||
|
||||
|
||||
static void declare_args(const func_t *func)
|
||||
{
|
||||
int in_attr, out_attr;
|
||||
int i = 0;
|
||||
const var_t *var;
|
||||
|
||||
if (!func->args)
|
||||
return;
|
||||
|
||||
LIST_FOR_EACH_ENTRY( var, func->args, const var_t, entry )
|
||||
{
|
||||
const expr_t *size_is = get_attrp(var->attrs, ATTR_SIZEIS);
|
||||
int has_size = size_is && (size_is->type != EXPR_VOID);
|
||||
int is_string = is_attr(var->attrs, ATTR_STRING);
|
||||
|
||||
in_attr = is_attr(var->attrs, ATTR_IN);
|
||||
out_attr = is_attr(var->attrs, ATTR_OUT);
|
||||
if (!out_attr && !in_attr)
|
||||
in_attr = 1;
|
||||
|
||||
if (!in_attr && !has_size && !is_string)
|
||||
{
|
||||
int indirection;
|
||||
print_server("");
|
||||
write_type(server, var->type, NULL, var->tname);
|
||||
for (indirection = 0; indirection < var->ptr_level - 1; indirection++)
|
||||
fprintf(server, "*");
|
||||
fprintf(server, " _W%u;\n", i++);
|
||||
}
|
||||
|
||||
print_server("");
|
||||
write_type(server, var->type, var, var->tname);
|
||||
fprintf(server, " ");
|
||||
write_name(server, var);
|
||||
write_array(server, var->array, 0);
|
||||
fprintf(server, ";\n");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void assign_out_args(const func_t *func)
|
||||
{
|
||||
int in_attr, out_attr;
|
||||
int i = 0, sep = 0;
|
||||
const var_t *var;
|
||||
const expr_t *size_is;
|
||||
int has_size;
|
||||
|
||||
if (!func->args)
|
||||
return;
|
||||
|
||||
LIST_FOR_EACH_ENTRY( var, func->args, const var_t, entry )
|
||||
{
|
||||
int is_string = is_attr(var->attrs, ATTR_STRING);
|
||||
size_is = get_attrp(var->attrs, ATTR_SIZEIS);
|
||||
has_size = size_is && (size_is->type != EXPR_VOID);
|
||||
in_attr = is_attr(var->attrs, ATTR_IN);
|
||||
out_attr = is_attr(var->attrs, ATTR_OUT);
|
||||
if (!out_attr && !in_attr)
|
||||
in_attr = 1;
|
||||
|
||||
if (!in_attr)
|
||||
{
|
||||
print_server("");
|
||||
write_name(server, var);
|
||||
|
||||
if (has_size)
|
||||
{
|
||||
unsigned int size;
|
||||
type_t *type = var->type;
|
||||
|
||||
fprintf(server, " = NdrAllocate(&_StubMsg, ");
|
||||
write_expr(server, size_is, 1);
|
||||
size = get_type_memsize(type);
|
||||
fprintf(server, " * %u);\n", size);
|
||||
}
|
||||
else if (!is_string)
|
||||
{
|
||||
fprintf(server, " = &_W%u;\n", i);
|
||||
if (var->ptr_level > 1)
|
||||
print_server("_W%u = 0;\n", i);
|
||||
i++;
|
||||
}
|
||||
|
||||
sep = 1;
|
||||
}
|
||||
}
|
||||
|
||||
if (sep)
|
||||
fprintf(server, "\n");
|
||||
}
|
||||
|
||||
|
||||
static void write_function_stubs(type_t *iface, unsigned int *proc_offset, unsigned int *type_offset)
|
||||
{
|
||||
char *implicit_handle = get_attrp(iface->attrs, ATTR_IMPLICIT_HANDLE);
|
||||
|
@ -215,16 +122,8 @@ static void write_function_stubs(type_t *iface, unsigned int *proc_offset, unsig
|
|||
fprintf(server, "{\n");
|
||||
indent++;
|
||||
|
||||
/* declare return value '_RetVal' */
|
||||
if (!is_void(def->type, NULL))
|
||||
{
|
||||
print_server("");
|
||||
write_type(server, def->type, def, def->tname);
|
||||
fprintf(server, " _RetVal;\n");
|
||||
}
|
||||
|
||||
/* Declare arguments */
|
||||
declare_args(func);
|
||||
declare_stub_args(server, indent, func);
|
||||
|
||||
print_server("MIDL_STUB_MESSAGE _StubMsg;\n");
|
||||
print_server("RPC_STATUS _Status;\n");
|
||||
|
@ -291,7 +190,7 @@ static void write_function_stubs(type_t *iface, unsigned int *proc_offset, unsig
|
|||
fprintf(server, "\n");
|
||||
|
||||
/* Assign 'out' arguments */
|
||||
assign_out_args(func);
|
||||
assign_stub_out_args(server, indent, func);
|
||||
|
||||
/* Call the real server function */
|
||||
if (!is_void(def->type, NULL))
|
||||
|
|
|
@ -2099,6 +2099,108 @@ static void write_struct_expr(FILE *h, const expr_t *e, int brackets,
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
void declare_stub_args( FILE *file, int indent, const func_t *func )
|
||||
{
|
||||
int in_attr, out_attr;
|
||||
int i = 0;
|
||||
const var_t *def = func->def;
|
||||
const var_t *var;
|
||||
|
||||
/* declare return value '_RetVal' */
|
||||
if (!is_void(def->type, NULL))
|
||||
{
|
||||
print_file(file, indent, "");
|
||||
write_type(file, def->type, def, def->tname);
|
||||
fprintf(file, " _RetVal;\n");
|
||||
}
|
||||
|
||||
if (!func->args)
|
||||
return;
|
||||
|
||||
LIST_FOR_EACH_ENTRY( var, func->args, const var_t, entry )
|
||||
{
|
||||
const expr_t *size_is = get_attrp(var->attrs, ATTR_SIZEIS);
|
||||
int has_size = size_is && (size_is->type != EXPR_VOID);
|
||||
int is_string = is_attr(var->attrs, ATTR_STRING);
|
||||
|
||||
in_attr = is_attr(var->attrs, ATTR_IN);
|
||||
out_attr = is_attr(var->attrs, ATTR_OUT);
|
||||
if (!out_attr && !in_attr)
|
||||
in_attr = 1;
|
||||
|
||||
if (!in_attr && !has_size && !is_string)
|
||||
{
|
||||
int indirection;
|
||||
print_file(file, indent, "");
|
||||
write_type(file, var->type, NULL, var->tname);
|
||||
for (indirection = 0; indirection < var->ptr_level - 1; indirection++)
|
||||
fprintf(file, "*");
|
||||
fprintf(file, " _W%u;\n", i++);
|
||||
}
|
||||
|
||||
print_file(file, indent, "");
|
||||
write_type(file, var->type, var, var->tname);
|
||||
fprintf(file, " ");
|
||||
write_name(file, var);
|
||||
write_array(file, var->array, 0);
|
||||
fprintf(file, ";\n");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void assign_stub_out_args( FILE *file, int indent, const func_t *func )
|
||||
{
|
||||
int in_attr, out_attr;
|
||||
int i = 0, sep = 0;
|
||||
const var_t *var;
|
||||
const expr_t *size_is;
|
||||
int has_size;
|
||||
|
||||
if (!func->args)
|
||||
return;
|
||||
|
||||
LIST_FOR_EACH_ENTRY( var, func->args, const var_t, entry )
|
||||
{
|
||||
int is_string = is_attr(var->attrs, ATTR_STRING);
|
||||
size_is = get_attrp(var->attrs, ATTR_SIZEIS);
|
||||
has_size = size_is && (size_is->type != EXPR_VOID);
|
||||
in_attr = is_attr(var->attrs, ATTR_IN);
|
||||
out_attr = is_attr(var->attrs, ATTR_OUT);
|
||||
if (!out_attr && !in_attr)
|
||||
in_attr = 1;
|
||||
|
||||
if (!in_attr)
|
||||
{
|
||||
print_file(file, indent, "");
|
||||
write_name(file, var);
|
||||
|
||||
if (has_size)
|
||||
{
|
||||
unsigned int size;
|
||||
type_t *type = var->type;
|
||||
|
||||
fprintf(file, " = NdrAllocate(&_StubMsg, ");
|
||||
write_expr(file, size_is, 1);
|
||||
size = get_type_memsize(type);
|
||||
fprintf(file, " * %u);\n", size);
|
||||
}
|
||||
else if (!is_string)
|
||||
{
|
||||
fprintf(file, " = &_W%u;\n", i);
|
||||
if (var->ptr_level > 1)
|
||||
print_file(file, indent, "_W%u = 0;\n", i);
|
||||
i++;
|
||||
}
|
||||
|
||||
sep = 1;
|
||||
}
|
||||
}
|
||||
if (sep)
|
||||
fprintf(file, "\n");
|
||||
}
|
||||
|
||||
|
||||
int write_expr_eval_routines(FILE *file, const char *iface)
|
||||
{
|
||||
int result = 0;
|
||||
|
|
|
@ -46,5 +46,7 @@ size_t get_size_procformatstring_var(const var_t *var);
|
|||
size_t get_size_typeformatstring_var(const var_t *var);
|
||||
size_t get_size_procformatstring(const ifref_list_t *ifaces, int for_objects);
|
||||
size_t get_size_typeformatstring(const ifref_list_t *ifaces, int for_objects);
|
||||
void assign_stub_out_args( FILE *file, int indent, const func_t *func );
|
||||
void declare_stub_args( FILE *file, int indent, const func_t *func );
|
||||
int write_expr_eval_routines(FILE *file, const char *iface);
|
||||
void write_expr_eval_routine_list(FILE *file, const char *iface);
|
||||
|
|
Loading…
Reference in New Issue