From bf011b0f53a12bd4be95ebde86c5d02ca1b73b76 Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Mon, 15 Sep 2008 16:46:01 +0200 Subject: [PATCH] widl: Infrastructure for adding a prefix to local variable references. --- tools/widl/client.c | 8 ++-- tools/widl/expr.c | 44 +++++++++--------- tools/widl/expr.h | 3 +- tools/widl/header.c | 4 +- tools/widl/proxy.c | 36 +++++++-------- tools/widl/server.c | 16 +++---- tools/widl/typegen.c | 125 ++++++++++++++++++++++++++------------------------- tools/widl/typegen.h | 10 +++-- 8 files changed, 127 insertions(+), 119 deletions(-) diff --git a/tools/widl/client.c b/tools/widl/client.c index 9e31a55fd07..7e7bb1669ce 100644 --- a/tools/widl/client.c +++ b/tools/widl/client.c @@ -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 */ diff --git a/tools/widl/expr.c b/tools/widl/expr.c index dac5d9af2be..3b668ef07e7 100644 --- a/tools/widl/expr.c +++ b/tools/widl/expr.c @@ -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; diff --git a/tools/widl/expr.h b/tools/widl/expr.h index 1b773e0a33d..31ce31d3e9e 100644 --- a/tools/widl/expr.h +++ b/tools/widl/expr.h @@ -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); diff --git a/tools/widl/header.c b/tools/widl/header.c index 0a2a98a8a27..0d9832d30e1 100644 --- a/tools/widl/header.c +++ b/tools/widl/header.c @@ -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) diff --git a/tools/widl/proxy.c b/tools/widl/proxy.c index 30d2a754715..32ff58a56e4 100644 --- a/tools/widl/proxy.c +++ b/tools/widl/proxy.c @@ -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); diff --git a/tools/widl/server.c b/tools/widl/server.c index a15288106a8..f7c75fec3b7 100644 --- a/tools/widl/server.c +++ b/tools/widl/server.c @@ -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); diff --git a/tools/widl/typegen.c b/tools/widl/typegen.c index c7596aeaf78..3d382d2a7b7 100644 --- a/tools/widl/typegen.c +++ b/tools/widl/typegen.c @@ -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++; diff --git a/tools/widl/typegen.h b/tools/widl/typegen.h index 37e0cc80011..0276b7fa433 100644 --- a/tools/widl/typegen.h +++ b/tools/widl/typegen.h @@ -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); -- 2.11.4.GIT