Jacek Caban : widl: Fix handling context handle return type in mixed mode.
Alexandre Julliard
julliard at winehq.org
Wed Jan 30 17:36:15 CST 2019
Module: wine
Branch: master
Commit: 83b943802906a2dce7656b04c1b5779d90cc50e8
URL: https://source.winehq.org/git/wine.git/?a=commit;h=83b943802906a2dce7656b04c1b5779d90cc50e8
Author: Jacek Caban <jacek at codeweavers.com>
Date: Wed Jan 30 13:48:46 2019 +0100
widl: Fix handling context handle return type in mixed mode.
Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/rpcrt4/tests/server.c | 2 --
tools/widl/server.c | 20 ++++++++++++++------
tools/widl/typegen.c | 16 +++++++++++-----
3 files changed, 25 insertions(+), 13 deletions(-)
diff --git a/dlls/rpcrt4/tests/server.c b/dlls/rpcrt4/tests/server.c
index 4f8f043..d68918b 100644
--- a/dlls/rpcrt4/tests/server.c
+++ b/dlls/rpcrt4/tests/server.c
@@ -1839,8 +1839,6 @@ static void test_handle_return(void)
{
ctx_handle_t handle, handle2;
- if (!is_interp) return; /* broken in widl */
-
handle = get_handle();
test_handle(handle);
get_handle_by_ptr(&handle2);
diff --git a/tools/widl/server.c b/tools/widl/server.c
index d165bbb..59c17d6 100644
--- a/tools/widl/server.c
+++ b/tools/widl/server.c
@@ -55,6 +55,7 @@ static void write_function_stub(const type_t *iface, const var_t *func, unsigned
unsigned char explicit_fc, implicit_fc;
int has_full_pointer = is_full_pointer_function(func);
const var_t *handle_var = get_func_handle_var( iface, func, &explicit_fc, &implicit_fc );
+ type_t *ret_type = type_function_get_rettype(func->type);
if (is_interpreted_func( iface, func )) return;
@@ -75,7 +76,7 @@ static void write_function_stub(const type_t *iface, const var_t *func, unsigned
indent++;
write_remoting_arguments(server, indent, func, "__frame->", PASS_OUT, PHASE_FREE);
- if (!is_void(type_function_get_rettype(func->type)))
+ if (!is_void(ret_type))
write_remoting_arguments(server, indent, func, "__frame->", PASS_RETURN, PHASE_FREE);
if (has_full_pointer)
@@ -154,9 +155,16 @@ static void write_function_stub(const type_t *iface, const var_t *func, unsigned
assign_stub_out_args(server, indent, func, "__frame->");
/* Call the real server function */
- print_server("%s%s%s",
- is_void(type_function_get_rettype(func->type)) ? "" : "__frame->_RetVal = ",
- prefix_server, get_name(func));
+ if (is_context_handle(ret_type))
+ {
+ print_server("__frame->_RetVal = NDRSContextUnmarshall((char*)0, _pRpcMessage->DataRepresentation);\n");
+ print_server("*((");
+ write_type_decl(server, ret_type, NULL);
+ fprintf(server, "*)NDRSContextValue(__frame->_RetVal)) = ");
+ }
+ else
+ print_server("%s", is_void(ret_type) ? "" : "__frame->_RetVal = ");
+ fprintf(server, "%s%s", prefix_server, get_name(func));
if (type_get_function_args(func->type))
{
@@ -197,7 +205,7 @@ static void write_function_stub(const type_t *iface, const var_t *func, unsigned
{
write_remoting_arguments(server, indent, func, "__frame->", PASS_OUT, PHASE_BUFFERSIZE);
- if (!is_void(type_function_get_rettype(func->type)))
+ if (!is_void(ret_type))
write_remoting_arguments(server, indent, func, "__frame->", PASS_RETURN, PHASE_BUFFERSIZE);
print_server("_pRpcMessage->BufferLength = __frame->_StubMsg.BufferLength;\n");
@@ -216,7 +224,7 @@ static void write_function_stub(const type_t *iface, const var_t *func, unsigned
write_remoting_arguments(server, indent, func, "__frame->", PASS_OUT, PHASE_MARSHAL);
/* marshall the return value */
- if (!is_void(type_function_get_rettype(func->type)))
+ if (!is_void(ret_type))
write_remoting_arguments(server, indent, func, "__frame->", PASS_RETURN, PHASE_MARSHAL);
indent--;
diff --git a/tools/widl/typegen.c b/tools/widl/typegen.c
index 7a81277..e5fb20c 100644
--- a/tools/widl/typegen.c
+++ b/tools/widl/typegen.c
@@ -4246,13 +4246,14 @@ static void write_remoting_arg(FILE *file, int indent, const var_t *func, const
}
else if (phase == PHASE_UNMARSHAL)
{
- if (pass == PASS_OUT)
+ if (pass == PASS_OUT || pass == PASS_RETURN)
{
if (!in_attr)
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%s,\n", local_var_prefix, var->name);
+ print_file(file, indent + 1, "(NDR_CCONTEXT *)%s%s%s,\n",
+ pass == PASS_RETURN ? "&" : "", local_var_prefix, var->name);
print_file(file, indent + 1, "__frame->_Handle);\n");
}
else
@@ -4605,9 +4606,14 @@ void declare_stub_args( FILE *file, int indent, const var_t *func )
/* declare return value */
if (!is_void(var->type))
{
- print_file(file, indent, "%s", "");
- write_type_decl(file, var->type, var->name);
- fprintf(file, ";\n");
+ if (is_context_handle(var->type))
+ print_file(file, indent, "NDR_SCONTEXT %s;\n", var->name);
+ else
+ {
+ print_file(file, indent, "%s", "");
+ write_type_decl(file, var->type, var->name);
+ fprintf(file, ";\n");
+ }
}
if (!type_get_function_args(func->type))
More information about the wine-cvs
mailing list