widl: Infrastructure for adding a prefix to local variable references.

oldstable
Alexandre Julliard 2008-09-15 16:46:01 +02:00
parent 3bdaba2a93
commit bf011b0f53
8 changed files with 127 additions and 119 deletions

View File

@ -204,7 +204,7 @@ static void write_function_stubs(type_t *iface, unsigned int *proc_offset)
fprintf(client, "\n");
}
write_remoting_arguments(client, indent, func, PASS_IN, PHASE_BUFFERSIZE);
write_remoting_arguments(client, indent, func, "", PASS_IN, PHASE_BUFFERSIZE);
print_client("NdrGetBuffer(\n");
indent++;
@ -218,7 +218,7 @@ static void write_function_stubs(type_t *iface, unsigned int *proc_offset)
fprintf(client, "\n");
/* marshal arguments */
write_remoting_arguments(client, indent, func, PASS_IN, PHASE_MARSHAL);
write_remoting_arguments(client, indent, func, "", PASS_IN, PHASE_MARSHAL);
/* send/receive message */
/* print_client("NdrNsSendReceive(\n"); */
@ -248,7 +248,7 @@ static void write_function_stubs(type_t *iface, unsigned int *proc_offset)
/* unmarshall arguments */
fprintf(client, "\n");
write_remoting_arguments(client, indent, func, PASS_OUT, PHASE_UNMARSHAL);
write_remoting_arguments(client, indent, func, "", PASS_OUT, PHASE_UNMARSHAL);
/* unmarshal return value */
if (!is_void(get_func_return_type(func)))
@ -257,7 +257,7 @@ static void write_function_stubs(type_t *iface, unsigned int *proc_offset)
print_client("MIDL_memset(&%s, 0, sizeof(%s));\n", "_RetVal", "_RetVal");
else if (is_ptr(get_func_return_type(func)) || is_array(get_func_return_type(func)))
print_client("%s = 0;\n", "_RetVal");
write_remoting_arguments(client, indent, func, PASS_RETURN, PHASE_UNMARSHAL);
write_remoting_arguments(client, indent, func, "", PASS_RETURN, PHASE_UNMARSHAL);
}
/* update proc_offset */

View File

@ -576,7 +576,7 @@ const type_t *expr_resolve_type(const struct expr_loc *expr_loc, const type_t *c
void write_expr(FILE *h, const expr_t *e, int brackets,
int toplevel, const char *toplevel_prefix,
const type_t *cont_type)
const type_t *cont_type, const char *local_var_prefix)
{
switch (e->type)
{
@ -602,9 +602,13 @@ void write_expr(FILE *h, const expr_t *e, int brackets,
{
int found_in_cont_type;
find_identifier(e->u.sval, cont_type, &found_in_cont_type);
if (found_in_cont_type) fprintf(h, "%s", toplevel_prefix);
if (found_in_cont_type)
{
fprintf(h, "%s%s", toplevel_prefix, e->u.sval);
break;
}
}
fprintf(h, "%s", e->u.sval);
fprintf(h, "%s%s", local_var_prefix, e->u.sval);
break;
case EXPR_STRLIT:
fprintf(h, "\"%s\"", e->u.sval);
@ -614,33 +618,33 @@ void write_expr(FILE *h, const expr_t *e, int brackets,
break;
case EXPR_LOGNOT:
fprintf(h, "!");
write_expr(h, e->ref, 1, toplevel, toplevel_prefix, cont_type);
write_expr(h, e->ref, 1, toplevel, toplevel_prefix, cont_type, local_var_prefix);
break;
case EXPR_NOT:
fprintf(h, "~");
write_expr(h, e->ref, 1, toplevel, toplevel_prefix, cont_type);
write_expr(h, e->ref, 1, toplevel, toplevel_prefix, cont_type, local_var_prefix);
break;
case EXPR_POS:
fprintf(h, "+");
write_expr(h, e->ref, 1, toplevel, toplevel_prefix, cont_type);
write_expr(h, e->ref, 1, toplevel, toplevel_prefix, cont_type, local_var_prefix);
break;
case EXPR_NEG:
fprintf(h, "-");
write_expr(h, e->ref, 1, toplevel, toplevel_prefix, cont_type);
write_expr(h, e->ref, 1, toplevel, toplevel_prefix, cont_type, local_var_prefix);
break;
case EXPR_ADDRESSOF:
fprintf(h, "&");
write_expr(h, e->ref, 1, toplevel, toplevel_prefix, cont_type);
write_expr(h, e->ref, 1, toplevel, toplevel_prefix, cont_type, local_var_prefix);
break;
case EXPR_PPTR:
fprintf(h, "*");
write_expr(h, e->ref, 1, toplevel, toplevel_prefix, cont_type);
write_expr(h, e->ref, 1, toplevel, toplevel_prefix, cont_type, local_var_prefix);
break;
case EXPR_CAST:
fprintf(h, "(");
write_type_decl(h, e->u.tref, NULL);
fprintf(h, ")");
write_expr(h, e->ref, 1, toplevel, toplevel_prefix, cont_type);
write_expr(h, e->ref, 1, toplevel, toplevel_prefix, cont_type, local_var_prefix);
break;
case EXPR_SIZEOF:
fprintf(h, "sizeof(");
@ -666,7 +670,7 @@ void write_expr(FILE *h, const expr_t *e, int brackets,
case EXPR_GTREQL:
case EXPR_LESSEQL:
if (brackets) fprintf(h, "(");
write_expr(h, e->ref, 1, toplevel, toplevel_prefix, cont_type);
write_expr(h, e->ref, 1, toplevel, toplevel_prefix, cont_type, local_var_prefix);
switch (e->type)
{
case EXPR_SHL: fprintf(h, " << "); break;
@ -689,38 +693,38 @@ void write_expr(FILE *h, const expr_t *e, int brackets,
case EXPR_LESSEQL: fprintf(h, " <= "); break;
default: break;
}
write_expr(h, e->u.ext, 1, toplevel, toplevel_prefix, cont_type);
write_expr(h, e->u.ext, 1, toplevel, toplevel_prefix, cont_type, local_var_prefix);
if (brackets) fprintf(h, ")");
break;
case EXPR_MEMBER:
if (brackets) fprintf(h, "(");
if (e->ref->type == EXPR_PPTR)
{
write_expr(h, e->ref->ref, 1, toplevel, toplevel_prefix, cont_type);
write_expr(h, e->ref->ref, 1, toplevel, toplevel_prefix, cont_type, local_var_prefix);
fprintf(h, "->");
}
else
{
write_expr(h, e->ref, 1, toplevel, toplevel_prefix, cont_type);
write_expr(h, e->ref, 1, toplevel, toplevel_prefix, cont_type, local_var_prefix);
fprintf(h, ".");
}
write_expr(h, e->u.ext, 1, 0, toplevel_prefix, cont_type);
write_expr(h, e->u.ext, 1, 0, toplevel_prefix, cont_type, "");
if (brackets) fprintf(h, ")");
break;
case EXPR_COND:
if (brackets) fprintf(h, "(");
write_expr(h, e->ref, 1, toplevel, toplevel_prefix, cont_type);
write_expr(h, e->ref, 1, toplevel, toplevel_prefix, cont_type, local_var_prefix);
fprintf(h, " ? ");
write_expr(h, e->u.ext, 1, toplevel, toplevel_prefix, cont_type);
write_expr(h, e->u.ext, 1, toplevel, toplevel_prefix, cont_type, local_var_prefix);
fprintf(h, " : ");
write_expr(h, e->ext2, 1, toplevel, toplevel_prefix, cont_type);
write_expr(h, e->ext2, 1, toplevel, toplevel_prefix, cont_type, local_var_prefix);
if (brackets) fprintf(h, ")");
break;
case EXPR_ARRAY:
if (brackets) fprintf(h, "(");
write_expr(h, e->ref, 1, toplevel, toplevel_prefix, cont_type);
write_expr(h, e->ref, 1, toplevel, toplevel_prefix, cont_type, local_var_prefix);
fprintf(h, "[");
write_expr(h, e->u.ext, 1, 1, toplevel_prefix, cont_type);
write_expr(h, e->u.ext, 1, 1, toplevel_prefix, cont_type, local_var_prefix);
fprintf(h, "]");
if (brackets) fprintf(h, ")");
break;

View File

@ -37,4 +37,5 @@ extern expr_t *make_expr3(enum expr_type type, expr_t *expr1, expr_t *expr2, exp
extern const type_t *expr_resolve_type(const struct expr_loc *expr_loc, const type_t *cont_type, const expr_t *expr);
extern int compare_expr(const expr_t *a, const expr_t *b);
extern void write_expr(FILE *h, const expr_t *e, int brackets, int toplevel, const char *toplevel_prefix, const type_t *cont_type);
extern void write_expr(FILE *h, const expr_t *e, int brackets, int toplevel, const char *toplevel_prefix,
const type_t *cont_type, const char *local_var_prefix);

View File

@ -194,7 +194,7 @@ static void write_enums(FILE *h, var_list_t *enums)
fprintf(h, "%s", get_name(v));
if (v->eval) {
fprintf(h, " = ");
write_expr(h, v->eval, 0, 1, NULL, NULL);
write_expr(h, v->eval, 0, 1, NULL, NULL, "");
}
}
if (list_next( enums, &v->entry )) fprintf(h, ",\n");
@ -499,7 +499,7 @@ void write_declaration(const var_t *v, int is_in_interface)
if (is_const_decl(v) && v->eval)
{
fprintf(header, "#define %s (", v->name);
write_expr(header, v->eval, 0, 1, NULL, NULL);
write_expr(header, v->eval, 0, 1, NULL, NULL, "");
fprintf(header, ")\n\n");
}
else if (v->type->type != RPC_FC_FUNCTION || !is_in_interface)

View File

@ -213,7 +213,7 @@ static void proxy_check_pointers( const var_list_t *args )
}
}
static void free_variable( const var_t *arg )
static void free_variable( const var_t *arg, const char *local_var_prefix )
{
unsigned int type_offset = arg->type->typestring_offset;
expr_t *iid;
@ -223,7 +223,7 @@ static void free_variable( const var_t *arg )
if (size)
{
print_proxy( "__frame->_StubMsg.MaxCount = " );
write_expr(proxy, size, 0, 1, NULL, NULL);
write_expr(proxy, size, 0, 1, NULL, NULL, local_var_prefix);
fprintf(proxy, ";\n\n");
print_proxy( "NdrClearOutParameters( &__frame->_StubMsg, ");
fprintf(proxy, "&__MIDL_TypeFormatString.Format[%u], ", type_offset );
@ -251,7 +251,7 @@ static void free_variable( const var_t *arg )
if( iid )
{
print_proxy( "__frame->_StubMsg.MaxCount = (unsigned long) " );
write_expr(proxy, iid, 1, 1, NULL, NULL);
write_expr(proxy, iid, 1, 1, NULL, NULL, local_var_prefix);
print_proxy( ";\n\n" );
}
print_proxy( "NdrClearOutParameters( &__frame->_StubMsg, ");
@ -264,7 +264,7 @@ static void free_variable( const var_t *arg )
}
}
static void proxy_free_variables( var_list_t *args )
static void proxy_free_variables( var_list_t *args, const char *local_var_prefix )
{
const var_t *arg;
@ -272,7 +272,7 @@ static void proxy_free_variables( var_list_t *args )
LIST_FOR_EACH_ENTRY( arg, args, const var_t, entry )
if (is_attr(arg->attrs, ATTR_OUT))
{
free_variable( arg );
free_variable( arg, local_var_prefix );
fprintf(proxy, "\n");
}
}
@ -337,11 +337,11 @@ static void gen_proxy(type_t *iface, const func_t *cur, int idx,
print_proxy( "{\n" );
indent++;
write_remoting_arguments(proxy, indent, cur, PASS_IN, PHASE_BUFFERSIZE);
write_remoting_arguments(proxy, indent, cur, "", PASS_IN, PHASE_BUFFERSIZE);
print_proxy( "NdrProxyGetBuffer(This, &__frame->_StubMsg);\n" );
write_remoting_arguments(proxy, indent, cur, PASS_IN, PHASE_MARSHAL);
write_remoting_arguments(proxy, indent, cur, "", PASS_IN, PHASE_MARSHAL);
print_proxy( "NdrProxySendReceive(This, &__frame->_StubMsg);\n" );
fprintf(proxy, "\n");
@ -354,7 +354,7 @@ static void gen_proxy(type_t *iface, const func_t *cur, int idx,
indent--;
fprintf(proxy, "\n");
write_remoting_arguments(proxy, indent, cur, PASS_OUT, PHASE_UNMARSHAL);
write_remoting_arguments(proxy, indent, cur, "", PASS_OUT, PHASE_UNMARSHAL);
if (has_ret)
{
@ -362,7 +362,7 @@ static void gen_proxy(type_t *iface, const func_t *cur, int idx,
print_proxy("MIDL_memset(&%s, 0, sizeof(%s));\n", "_RetVal", "_RetVal");
else if (is_ptr(get_func_return_type(cur)) || is_array(get_func_return_type(cur)))
print_proxy("%s = 0;\n", "_RetVal");
write_remoting_arguments(proxy, indent, cur, PASS_RETURN, PHASE_UNMARSHAL);
write_remoting_arguments(proxy, indent, cur, "", PASS_RETURN, PHASE_UNMARSHAL);
}
indent--;
@ -380,7 +380,7 @@ static void gen_proxy(type_t *iface, const func_t *cur, int idx,
print_proxy( "{\n" );
if (has_ret) {
indent++;
proxy_free_variables( cur->args );
proxy_free_variables( cur->args, "" );
print_proxy( "_RetVal = NdrProxyErrorHandler(RpcExceptionCode());\n" );
indent--;
}
@ -424,7 +424,7 @@ static void gen_stub(type_t *iface, const func_t *cur, const char *cas,
fprintf(proxy, "\n");
print_proxy( "RpcExceptionInit( 0, __stub_finally );\n" );
write_parameters_init(proxy, indent, cur);
write_parameters_init(proxy, indent, cur, "");
print_proxy("RpcTryFinally\n");
print_proxy("{\n");
@ -437,10 +437,10 @@ static void gen_stub(type_t *iface, const func_t *cur, const char *cas,
indent--;
fprintf(proxy, "\n");
write_remoting_arguments(proxy, indent, cur, PASS_IN, PHASE_UNMARSHAL);
write_remoting_arguments(proxy, indent, cur, "", PASS_IN, PHASE_UNMARSHAL);
fprintf(proxy, "\n");
assign_stub_out_args( proxy, indent, cur );
assign_stub_out_args( proxy, indent, cur, "" );
print_proxy("*_pdwStubPhase = STUB_CALL_SERVER;\n");
fprintf(proxy, "\n");
@ -460,26 +460,26 @@ static void gen_stub(type_t *iface, const func_t *cur, const char *cas,
print_proxy("*_pdwStubPhase = STUB_MARSHAL;\n");
fprintf(proxy, "\n");
write_remoting_arguments(proxy, indent, cur, PASS_OUT, PHASE_BUFFERSIZE);
write_remoting_arguments(proxy, indent, cur, "", PASS_OUT, PHASE_BUFFERSIZE);
if (!is_void(get_func_return_type(cur)))
write_remoting_arguments(proxy, indent, cur, PASS_RETURN, PHASE_BUFFERSIZE);
write_remoting_arguments(proxy, indent, cur, "", PASS_RETURN, PHASE_BUFFERSIZE);
print_proxy("NdrStubGetBuffer(This, _pRpcChannelBuffer, &__frame->_StubMsg);\n");
write_remoting_arguments(proxy, indent, cur, PASS_OUT, PHASE_MARSHAL);
write_remoting_arguments(proxy, indent, cur, "", PASS_OUT, PHASE_MARSHAL);
fprintf(proxy, "\n");
/* marshall the return value */
if (!is_void(get_func_return_type(cur)))
write_remoting_arguments(proxy, indent, cur, PASS_RETURN, PHASE_MARSHAL);
write_remoting_arguments(proxy, indent, cur, "", PASS_RETURN, PHASE_MARSHAL);
indent--;
print_proxy("}\n");
print_proxy("RpcFinally\n");
print_proxy("{\n");
write_remoting_arguments(proxy, indent+1, cur, PASS_OUT, PHASE_FREE);
write_remoting_arguments(proxy, indent+1, cur, "", PASS_OUT, PHASE_FREE);
if (has_full_pointer)
write_full_pointer_free(proxy, indent, cur);

View File

@ -87,7 +87,7 @@ static void write_function_stubs(type_t *iface, unsigned int *proc_offset)
fprintf(server, "\n");
print_server( "RpcExceptionInit( __server_filter, __server_finally );\n" );
write_parameters_init(server, indent, func);
write_parameters_init(server, indent, func, "");
if (explicit_handle_var)
{
@ -117,7 +117,7 @@ static void write_function_stubs(type_t *iface, unsigned int *proc_offset)
fprintf(server, "\n");
/* unmarshall arguments */
write_remoting_arguments(server, indent, func, PASS_IN, PHASE_UNMARSHAL);
write_remoting_arguments(server, indent, func, "", PASS_IN, PHASE_UNMARSHAL);
}
print_server("if (__frame->_StubMsg.Buffer > __frame->_StubMsg.BufferEnd)\n");
@ -138,7 +138,7 @@ static void write_function_stubs(type_t *iface, unsigned int *proc_offset)
fprintf(server, "\n");
/* Assign 'out' arguments */
assign_stub_out_args(server, indent, func);
assign_stub_out_args(server, indent, func, "");
/* Call the real server function */
if (!is_void(get_func_return_type(func)))
@ -184,10 +184,10 @@ static void write_function_stubs(type_t *iface, unsigned int *proc_offset)
if (has_out_arg_or_return(func))
{
write_remoting_arguments(server, indent, func, PASS_OUT, PHASE_BUFFERSIZE);
write_remoting_arguments(server, indent, func, "", PASS_OUT, PHASE_BUFFERSIZE);
if (!is_void(get_func_return_type(func)))
write_remoting_arguments(server, indent, func, PASS_RETURN, PHASE_BUFFERSIZE);
write_remoting_arguments(server, indent, func, "", PASS_RETURN, PHASE_BUFFERSIZE);
print_server("_pRpcMessage->BufferLength = __frame->_StubMsg.BufferLength;\n");
fprintf(server, "\n");
@ -202,11 +202,11 @@ static void write_function_stubs(type_t *iface, unsigned int *proc_offset)
}
/* marshall arguments */
write_remoting_arguments(server, indent, func, PASS_OUT, PHASE_MARSHAL);
write_remoting_arguments(server, indent, func, "", PASS_OUT, PHASE_MARSHAL);
/* marshall the return value */
if (!is_void(get_func_return_type(func)))
write_remoting_arguments(server, indent, func, PASS_RETURN, PHASE_MARSHAL);
write_remoting_arguments(server, indent, func, "", PASS_RETURN, PHASE_MARSHAL);
indent--;
print_server("}\n");
@ -214,7 +214,7 @@ static void write_function_stubs(type_t *iface, unsigned int *proc_offset)
print_server("{\n");
indent++;
write_remoting_arguments(server, indent, func, PASS_OUT, PHASE_FREE);
write_remoting_arguments(server, indent, func, "", PASS_OUT, PHASE_FREE);
if (has_full_pointer)
write_full_pointer_free(server, indent, func);

View File

@ -341,26 +341,27 @@ void print(FILE *file, int indent, const char *format, va_list va)
}
static void write_var_init(FILE *file, int indent, const type_t *t, const char *n)
static void write_var_init(FILE *file, int indent, const type_t *t, const char *n, const char *local_var_prefix)
{
if (decl_indirect(t))
print_file(file, indent, "MIDL_memset(&%s, 0, sizeof(%s));\n", n, n);
print_file(file, indent, "MIDL_memset(&%s%s, 0, sizeof(%s%s));\n",
local_var_prefix, n, local_var_prefix, n);
else if (is_ptr(t) || is_array(t))
print_file(file, indent, "%s = 0;\n", n);
print_file(file, indent, "%s%s = 0;\n", local_var_prefix, n);
}
void write_parameters_init(FILE *file, int indent, const func_t *func)
void write_parameters_init(FILE *file, int indent, const func_t *func, const char *local_var_prefix)
{
const var_t *var;
if (!is_void(get_func_return_type(func)))
write_var_init(file, indent, get_func_return_type(func), "_RetVal");
write_var_init(file, indent, get_func_return_type(func), "_RetVal", local_var_prefix);
if (!func->args)
return;
LIST_FOR_EACH_ENTRY( var, func->args, const var_t, entry )
write_var_init(file, indent, var->type, var->name);
write_var_init(file, indent, var->type, var->name, local_var_prefix);
fprintf(file, "\n");
}
@ -2631,7 +2632,7 @@ static unsigned int get_function_buffer_size( const func_t *func, enum pass pass
}
static void print_phase_function(FILE *file, int indent, const char *type,
enum remoting_phase phase,
const char *local_var_prefix, enum remoting_phase phase,
const var_t *var, unsigned int type_offset)
{
const char *function;
@ -2657,9 +2658,10 @@ static void print_phase_function(FILE *file, int indent, const char *type,
print_file(file, indent, "Ndr%s%s(\n", type, function);
indent++;
print_file(file, indent, "&__frame->_StubMsg,\n");
print_file(file, indent, "%s%s%s%s,\n",
print_file(file, indent, "%s%s%s%s%s,\n",
(phase == PHASE_UNMARSHAL) ? "(unsigned char **)" : "(unsigned char *)",
(phase == PHASE_UNMARSHAL || decl_indirect(var->type)) ? "&" : "",
local_var_prefix,
(phase == PHASE_UNMARSHAL && decl_indirect(var->type)) ? "_p_" : "",
var->name);
print_file(file, indent, "(PFORMAT_STRING)&__MIDL_TypeFormatString.Format[%d]%s\n",
@ -2669,8 +2671,8 @@ static void print_phase_function(FILE *file, int indent, const char *type,
indent--;
}
void print_phase_basetype(FILE *file, int indent, enum remoting_phase phase,
enum pass pass, const var_t *var,
void print_phase_basetype(FILE *file, int indent, const char *local_var_prefix,
enum remoting_phase phase, enum pass pass, const var_t *var,
const char *varname)
{
type_t *type = var->type;
@ -2740,7 +2742,7 @@ void print_phase_basetype(FILE *file, int indent, enum remoting_phase phase,
fprintf(file, " *)__frame->_StubMsg.Buffer = *");
else
fprintf(file, " *)__frame->_StubMsg.Buffer = ");
fprintf(file, "%s", varname);
fprintf(file, "%s%s", local_var_prefix, varname);
fprintf(file, ";\n");
}
else if (phase == PHASE_UNMARSHAL)
@ -2755,7 +2757,7 @@ void print_phase_basetype(FILE *file, int indent, enum remoting_phase phase,
print_file(file, indent, "");
else
print_file(file, indent, "*");
fprintf(file, "%s", varname);
fprintf(file, "%s%s", local_var_prefix, varname);
if (pass == PASS_IN && is_ptr(type))
fprintf(file, " = (");
else
@ -2794,9 +2796,8 @@ expr_t *get_size_is_expr(const type_t *t, const char *name)
return x;
}
static void write_parameter_conf_or_var_exprs(FILE *file, int indent,
enum remoting_phase phase,
const var_t *var)
static void write_parameter_conf_or_var_exprs(FILE *file, int indent, const char *local_var_prefix,
enum remoting_phase phase, const var_t *var)
{
const type_t *type = var->type;
/* get fundamental type for the argument */
@ -2813,15 +2814,15 @@ static void write_parameter_conf_or_var_exprs(FILE *file, int indent,
if (type->size_is)
{
print_file(file, indent, "__frame->_StubMsg.MaxCount = (unsigned long)");
write_expr(file, type->size_is, 1, 1, NULL, NULL);
write_expr(file, type->size_is, 1, 1, NULL, NULL, local_var_prefix);
fprintf(file, ";\n\n");
}
if (type->length_is)
{
print_file(file, indent, "__frame->_StubMsg.Offset = (unsigned long)0;\n"); /* FIXME */
print_file(file, indent, "__frame->_StubMsg.ActualCount = (unsigned long)");
write_expr(file, type->length_is, 1, 1, NULL, NULL);
fprintf(file, ";\n\n");
print_file(file, indent, "__frame->_StubMsg.ActualCount = (unsigned long)");
write_expr(file, type->length_is, 1, 1, NULL, NULL, local_var_prefix);
fprintf(file, ";\n\n");
}
}
break;
@ -2831,7 +2832,7 @@ static void write_parameter_conf_or_var_exprs(FILE *file, int indent,
if (is_conformance_needed_for_phase(phase))
{
print_file(file, indent, "__frame->_StubMsg.MaxCount = (unsigned long)");
write_expr(file, get_attrp(var->attrs, ATTR_SWITCHIS), 1, 1, NULL, NULL);
write_expr(file, get_attrp(var->attrs, ATTR_SWITCHIS), 1, 1, NULL, NULL, local_var_prefix);
fprintf(file, ";\n\n");
}
break;
@ -2843,7 +2844,7 @@ static void write_parameter_conf_or_var_exprs(FILE *file, int indent,
if (is_conformance_needed_for_phase(phase) && (iid = get_attrp( var->attrs, ATTR_IIDIS )))
{
print_file( file, indent, "__frame->_StubMsg.MaxCount = (unsigned long) " );
write_expr( file, iid, 1, 1, NULL, NULL );
write_expr( file, iid, 1, 1, NULL, NULL, local_var_prefix );
fprintf( file, ";\n\n" );
}
break;
@ -2855,9 +2856,8 @@ static void write_parameter_conf_or_var_exprs(FILE *file, int indent,
}
}
static void write_remoting_arg(FILE *file, int indent, const func_t *func,
enum pass pass, enum remoting_phase phase,
const var_t *var)
static void write_remoting_arg(FILE *file, int indent, const func_t *func, const char *local_var_prefix,
enum pass pass, enum remoting_phase phase, const var_t *var)
{
int in_attr, out_attr, pointer_type;
const type_t *type = var->type;
@ -2886,7 +2886,7 @@ static void write_remoting_arg(FILE *file, int indent, const func_t *func,
break;
}
write_parameter_conf_or_var_exprs(file, indent, phase, var);
write_parameter_conf_or_var_exprs(file, indent, local_var_prefix, phase, var);
rtype = type->type;
if (is_context_handle(type))
@ -2901,14 +2901,14 @@ static void write_remoting_arg(FILE *file, int indent, const func_t *func,
int is_ch_ptr = is_aliaschain_attr(type, ATTR_CONTEXTHANDLE) ? FALSE : TRUE;
print_file(file, indent, "NdrClientContextMarshall(\n");
print_file(file, indent + 1, "&__frame->_StubMsg,\n");
print_file(file, indent + 1, "(NDR_CCONTEXT)%s%s,\n", is_ch_ptr ? "*" : "", var->name);
print_file(file, indent + 1, "(NDR_CCONTEXT)%s%s%s,\n", is_ch_ptr ? "*" : "", local_var_prefix, var->name);
print_file(file, indent + 1, "%s);\n", in_attr && out_attr ? "1" : "0");
}
else
{
print_file(file, indent, "NdrServerContextNewMarshall(\n");
print_file(file, indent + 1, "&__frame->_StubMsg,\n");
print_file(file, indent + 1, "(NDR_SCONTEXT)%s,\n", var->name);
print_file(file, indent + 1, "(NDR_SCONTEXT)%s%s,\n", local_var_prefix, var->name);
print_file(file, indent + 1, "(NDR_RUNDOWN)%s_rundown,\n", get_context_handle_type_name(var->type));
print_file(file, indent + 1, "(PFORMAT_STRING)&__MIDL_TypeFormatString.Format[%d]);\n", start_offset);
}
@ -2918,15 +2918,15 @@ static void write_remoting_arg(FILE *file, int indent, const func_t *func,
if (pass == PASS_OUT)
{
if (!in_attr)
print_file(file, indent, "*%s = 0;\n", var->name);
print_file(file, indent, "*%s%s = 0;\n", local_var_prefix, var->name);
print_file(file, indent, "NdrClientContextUnmarshall(\n");
print_file(file, indent + 1, "&__frame->_StubMsg,\n");
print_file(file, indent + 1, "(NDR_CCONTEXT *)%s,\n", var->name);
print_file(file, indent + 1, "(NDR_CCONTEXT *)%s%s,\n", local_var_prefix, var->name);
print_file(file, indent + 1, "_Handle);\n");
}
else
{
print_file(file, indent, "%s = NdrServerContextNewUnmarshall(\n", var->name);
print_file(file, indent, "%s%s = NdrServerContextNewUnmarshall(\n", local_var_prefix, var->name);
print_file(file, indent + 1, "&__frame->_StubMsg,\n");
print_file(file, indent + 1, "(PFORMAT_STRING)&__MIDL_TypeFormatString.Format[%d]);\n", start_offset);
}
@ -2934,20 +2934,21 @@ static void write_remoting_arg(FILE *file, int indent, const func_t *func,
}
else if (is_user_type(var->type))
{
print_phase_function(file, indent, "UserMarshal", phase, var, start_offset);
print_phase_function(file, indent, "UserMarshal", local_var_prefix, phase, var, start_offset);
}
else if (is_string_type(var->attrs, var->type))
{
if (is_array(type) && !is_conformant_array(type))
print_phase_function(file, indent, "NonConformantString", phase, var, start_offset);
print_phase_function(file, indent, "NonConformantString", local_var_prefix,
phase, var, start_offset);
else
{
if (phase == PHASE_FREE || pass == PASS_RETURN || pointer_type == RPC_FC_UP)
print_phase_function(file, indent, "Pointer", phase, var,
print_phase_function(file, indent, "Pointer", local_var_prefix, phase, var,
start_offset - (type->size_is ? 4 : 2));
else
print_phase_function(file, indent, "ConformantString", phase, var,
start_offset);
print_phase_function(file, indent, "ConformantString", local_var_prefix,
phase, var, start_offset);
}
}
else if (is_array(type))
@ -2978,7 +2979,7 @@ static void write_remoting_arg(FILE *file, int indent, const func_t *func,
}
if (pointer_type != RPC_FC_RP) array_type = "Pointer";
print_phase_function(file, indent, array_type, phase, var, start_offset);
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 */
@ -2987,16 +2988,16 @@ static void write_remoting_arg(FILE *file, int indent, const func_t *func,
((type->type == RPC_FC_SMVARRAY || type->type == RPC_FC_LGVARRAY) && in_attr) ||
(type->type == RPC_FC_CARRAY && !in_attr))
{
print_file(file, indent, "if (%s)\n", var->name);
print_file(file, indent, "if (%s%s)\n", local_var_prefix, var->name);
indent++;
print_file(file, indent, "__frame->_StubMsg.pfnFree(%s);\n", var->name);
print_file(file, indent, "__frame->_StubMsg.pfnFree(%s%s);\n", local_var_prefix, var->name);
}
}
}
else if (!is_ptr(var->type) && is_base_type(rtype))
{
if (phase != PHASE_FREE)
print_phase_basetype(file, indent, phase, pass, var, var->name);
print_phase_basetype(file, indent, local_var_prefix, phase, pass, var, var->name);
}
else if (!is_ptr(var->type))
{
@ -3004,27 +3005,27 @@ static void write_remoting_arg(FILE *file, int indent, const func_t *func,
{
case RPC_FC_STRUCT:
case RPC_FC_PSTRUCT:
print_phase_function(file, indent, "SimpleStruct", phase, var, start_offset);
print_phase_function(file, indent, "SimpleStruct", local_var_prefix, phase, var, start_offset);
break;
case RPC_FC_CSTRUCT:
case RPC_FC_CPSTRUCT:
print_phase_function(file, indent, "ConformantStruct", phase, var, start_offset);
print_phase_function(file, indent, "ConformantStruct", local_var_prefix, phase, var, start_offset);
break;
case RPC_FC_CVSTRUCT:
print_phase_function(file, indent, "ConformantVaryingStruct", phase, var, start_offset);
print_phase_function(file, indent, "ConformantVaryingStruct", local_var_prefix, phase, var, start_offset);
break;
case RPC_FC_BOGUS_STRUCT:
print_phase_function(file, indent, "ComplexStruct", phase, var, start_offset);
print_phase_function(file, indent, "ComplexStruct", local_var_prefix, phase, var, start_offset);
break;
case RPC_FC_RP:
if (is_base_type( var->type->ref->type ))
{
print_phase_basetype(file, indent, phase, pass, var, var->name);
print_phase_basetype(file, indent, local_var_prefix, phase, pass, var, var->name);
}
else if (var->type->ref->type == RPC_FC_STRUCT)
{
if (phase != PHASE_BUFFERSIZE && phase != PHASE_FREE)
print_phase_function(file, indent, "SimpleStruct", phase, var, start_offset + 4);
print_phase_function(file, indent, local_var_prefix, "SimpleStruct", phase, var, start_offset + 4);
}
else
{
@ -3032,10 +3033,10 @@ static void write_remoting_arg(FILE *file, int indent, const func_t *func,
if ((iid = get_attrp( var->attrs, ATTR_IIDIS )))
{
print_file( file, indent, "__frame->_StubMsg.MaxCount = (unsigned long) " );
write_expr( file, iid, 1, 1, NULL, NULL );
write_expr( file, iid, 1, 1, NULL, NULL, local_var_prefix );
fprintf( file, ";\n\n" );
}
print_phase_function(file, indent, "Pointer", phase, var, start_offset);
print_phase_function(file, indent, "Pointer", local_var_prefix, phase, var, start_offset);
}
break;
default:
@ -3047,25 +3048,25 @@ static void write_remoting_arg(FILE *file, int indent, const func_t *func,
if (last_ptr(var->type) && (pointer_type == RPC_FC_RP) && is_base_type(rtype))
{
if (phase != PHASE_FREE)
print_phase_basetype(file, indent, phase, pass, var, var->name);
print_phase_basetype(file, indent, local_var_prefix, phase, pass, var, var->name);
}
else if (last_ptr(var->type) && (pointer_type == RPC_FC_RP) && (rtype == RPC_FC_STRUCT))
{
if (phase != PHASE_BUFFERSIZE && phase != PHASE_FREE)
print_phase_function(file, indent, "SimpleStruct", phase, var, start_offset + 4);
print_phase_function(file, indent, "SimpleStruct", local_var_prefix, phase, var, start_offset + 4);
}
else
{
if (var->type->ref->type == RPC_FC_IP)
print_phase_function(file, indent, "InterfacePointer", phase, var, start_offset);
print_phase_function(file, indent, "InterfacePointer", local_var_prefix, phase, var, start_offset);
else
print_phase_function(file, indent, "Pointer", phase, var, start_offset);
print_phase_function(file, indent, "Pointer", local_var_prefix, phase, var, start_offset);
}
}
fprintf(file, "\n");
}
void write_remoting_arguments(FILE *file, int indent, const func_t *func,
void write_remoting_arguments(FILE *file, int indent, const func_t *func, const char *local_var_prefix,
enum pass pass, enum remoting_phase phase)
{
if (phase == PHASE_BUFFERSIZE && pass != PASS_RETURN)
@ -3080,7 +3081,7 @@ void write_remoting_arguments(FILE *file, int indent, const func_t *func,
var = *func->def;
var.type = get_func_return_type(func);
var.name = xstrdup( "_RetVal" );
write_remoting_arg( file, indent, func, pass, phase, &var );
write_remoting_arg( file, indent, func, local_var_prefix, pass, phase, &var );
free( var.name );
}
else
@ -3089,7 +3090,7 @@ void write_remoting_arguments(FILE *file, int indent, const func_t *func,
if (!func->args)
return;
LIST_FOR_EACH_ENTRY( var, func->args, const var_t, entry )
write_remoting_arg( file, indent, func, pass, phase, var );
write_remoting_arg( file, indent, func, local_var_prefix, pass, phase, var );
}
}
@ -3196,9 +3197,9 @@ void declare_stub_args( FILE *file, int indent, const func_t *func )
write_type_decl_left(file, var->type);
fprintf(file, " ");
if (var->type->declarray) {
fprintf(file, "(*%s)", get_name(var));
fprintf(file, "(*%s)", var->name);
} else
fprintf(file, "%s", get_name(var));
fprintf(file, "%s", var->name);
write_type_right(file, var->type, FALSE);
fprintf(file, ";\n");
@ -3210,7 +3211,7 @@ void declare_stub_args( FILE *file, int indent, const func_t *func )
}
void assign_stub_out_args( FILE *file, int indent, const func_t *func )
void assign_stub_out_args( FILE *file, int indent, const func_t *func, const char *local_var_prefix )
{
int in_attr, out_attr;
int i = 0, sep = 0;
@ -3229,7 +3230,7 @@ void assign_stub_out_args( FILE *file, int indent, const func_t *func )
if (!in_attr)
{
print_file(file, indent, "%s", get_name(var));
print_file(file, indent, "%s%s", local_var_prefix, var->name);
if (is_context_handle(var->type))
{
@ -3246,7 +3247,7 @@ void assign_stub_out_args( FILE *file, int indent, const func_t *func )
fprintf(file, " = NdrAllocate(&__frame->_StubMsg, ");
for ( ; type->size_is ; type = type->ref)
{
write_expr(file, type->size_is, TRUE, TRUE, NULL, NULL);
write_expr(file, type->size_is, TRUE, TRUE, NULL, NULL, local_var_prefix);
fprintf(file, " * ");
}
size = type_memsize(type, &align);
@ -3254,9 +3255,9 @@ void assign_stub_out_args( FILE *file, int indent, const func_t *func )
}
else if (!is_string)
{
fprintf(file, " = &_W%u;\n", i);
fprintf(file, " = &%s_W%u;\n", local_var_prefix, i);
if (is_ptr(var->type) && !last_ptr(var->type))
print_file(file, indent, "_W%u = 0;\n", i);
print_file(file, indent, "%s_W%u = 0;\n", local_var_prefix, i);
i++;
}
@ -3288,7 +3289,7 @@ int write_expr_eval_routines(FILE *file, const char *iface)
name, var_name, name, eval->baseoff);
print_file(file, 1, "pStubMsg->Offset = 0;\n"); /* FIXME */
print_file(file, 1, "pStubMsg->MaxCount = (unsigned long)");
write_expr(file, eval->expr, 1, 1, var_name_expr, eval->structure);
write_expr(file, eval->expr, 1, 1, var_name_expr, eval->structure, "");
fprintf(file, ";\n");
print_file(file, 0, "}\n\n");
callback_offset++;

View File

@ -41,13 +41,15 @@ typedef int (*type_pred_t)(const type_t *);
void write_formatstringsdecl(FILE *f, int indent, const statement_list_t *stmts, type_pred_t pred);
void write_procformatstring(FILE *file, const statement_list_t *stmts, type_pred_t pred);
void write_typeformatstring(FILE *file, const statement_list_t *stmts, type_pred_t pred);
void print_phase_basetype(FILE *file, int indent, enum remoting_phase phase, enum pass pass, const var_t *var, const char *varname);
void write_remoting_arguments(FILE *file, int indent, const func_t *func, enum pass pass, enum remoting_phase phase);
void print_phase_basetype(FILE *file, int indent, const char *local_var_prefix, enum remoting_phase phase,
enum pass pass, const var_t *var, const char *varname);
void write_remoting_arguments(FILE *file, int indent, const func_t *func, const char *local_var_prefix,
enum pass pass, enum remoting_phase phase);
size_t get_size_procformatstring_type(const char *name, const type_t *type, const attr_list_t *attrs);
size_t get_size_procformatstring_func(const func_t *func);
size_t get_size_procformatstring(const statement_list_t *stmts, type_pred_t pred);
size_t get_size_typeformatstring(const statement_list_t *stmts, type_pred_t pred);
void assign_stub_out_args( FILE *file, int indent, const func_t *func );
void assign_stub_out_args( FILE *file, int indent, const func_t *func, const char *local_var_prefix );
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);
@ -56,7 +58,7 @@ void write_endpoints( FILE *f, const char *prefix, const str_list_t *list );
void write_exceptions( FILE *file );
size_t type_memsize(const type_t *t, unsigned int *align);
int decl_indirect(const type_t *t);
void write_parameters_init(FILE *file, int indent, const func_t *func);
void write_parameters_init(FILE *file, int indent, const func_t *func, const char *local_var_prefix);
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);