Commit d458a599 authored by Rob Shearman's avatar Rob Shearman Committed by Alexandre Julliard

widl: Add support for non-basetype return types.

parent a95420a0
...@@ -497,6 +497,12 @@ s_sum_L1_norms(int n, vector_t *vs) ...@@ -497,6 +497,12 @@ s_sum_L1_norms(int n, vector_t *vs)
return sum; return sum;
} }
str_t
s_get_filename(void)
{
return (char *)__FILE__;
}
void void
s_stop(void) s_stop(void)
{ {
...@@ -558,6 +564,7 @@ basic_tests(void) ...@@ -558,6 +564,7 @@ basic_tests(void)
int x; int x;
str_struct_t ss = {string}; str_struct_t ss = {string};
wstr_struct_t ws = {wstring}; wstr_struct_t ws = {wstring};
str_t str;
ok(int_return() == INT_CODE, "RPC int_return\n"); ok(int_return() == INT_CODE, "RPC int_return\n");
...@@ -652,6 +659,9 @@ basic_tests(void) ...@@ -652,6 +659,9 @@ basic_tests(void)
ok(sum_bogus(&bogus) == 12, "RPC sum_bogus\n"); ok(sum_bogus(&bogus) == 12, "RPC sum_bogus\n");
check_null(NULL); check_null(NULL);
str = get_filename();
ok(!strcmp(str, __FILE__), "get_filename() returned %s instead of %s\n", str, __FILE__);
} }
static void static void
......
...@@ -300,5 +300,7 @@ cpp_quote("#endif") ...@@ -300,5 +300,7 @@ cpp_quote("#endif")
int sum_pcarr2(int n, [size_is(, n)] int **pa); int sum_pcarr2(int n, [size_is(, n)] int **pa);
int sum_L1_norms(int n, [size_is(n)] vector_t *vs); int sum_L1_norms(int n, [size_is(n)] vector_t *vs);
str_t get_filename(void);
void stop(void); void stop(void);
} }
...@@ -139,6 +139,11 @@ static void write_function_stubs(type_t *iface, unsigned int *proc_offset) ...@@ -139,6 +139,11 @@ static void write_function_stubs(type_t *iface, unsigned int *proc_offset)
print_client("RPC_MESSAGE _RpcMessage;\n"); print_client("RPC_MESSAGE _RpcMessage;\n");
print_client("MIDL_STUB_MESSAGE _StubMsg;\n"); print_client("MIDL_STUB_MESSAGE _StubMsg;\n");
if (!is_void(def->type) && decl_indirect(def->type))
{
print_client("void *_p_%s = &%s;\n",
"_RetVal", "_RetVal");
}
fprintf(client, "\n"); fprintf(client, "\n");
/* check pointers */ /* check pointers */
...@@ -216,7 +221,13 @@ static void write_function_stubs(type_t *iface, unsigned int *proc_offset) ...@@ -216,7 +221,13 @@ static void write_function_stubs(type_t *iface, unsigned int *proc_offset)
/* unmarshal return value */ /* unmarshal return value */
if (!is_void(def->type)) if (!is_void(def->type))
print_phase_basetype(client, indent, PHASE_UNMARSHAL, PASS_RETURN, def, "_RetVal"); {
if (decl_indirect(def->type))
print_client("MIDL_memset(&%s, 0, sizeof(%s));\n", "_RetVal", "_RetVal");
else if (is_ptr(def->type) || is_array(def->type))
print_client("%s = 0;\n", "_RetVal");
write_remoting_arguments(client, indent, func, PASS_RETURN, PHASE_UNMARSHAL);
}
/* update proc_offset */ /* update proc_offset */
if (func->args) if (func->args)
......
...@@ -272,6 +272,11 @@ static void gen_proxy(type_t *iface, const func_t *cur, int idx, ...@@ -272,6 +272,11 @@ static void gen_proxy(type_t *iface, const func_t *cur, int idx,
} }
print_proxy( "RPC_MESSAGE _RpcMessage;\n" ); print_proxy( "RPC_MESSAGE _RpcMessage;\n" );
print_proxy( "MIDL_STUB_MESSAGE _StubMsg;\n" ); print_proxy( "MIDL_STUB_MESSAGE _StubMsg;\n" );
if (has_ret) {
if (decl_indirect(def->type))
print_proxy("void *_p_%s = &%s;\n",
"_RetVal", "_RetVal");
}
print_proxy( "\n"); print_proxy( "\n");
/* FIXME: trace */ /* FIXME: trace */
...@@ -307,7 +312,13 @@ static void gen_proxy(type_t *iface, const func_t *cur, int idx, ...@@ -307,7 +312,13 @@ static void gen_proxy(type_t *iface, const func_t *cur, int idx,
write_remoting_arguments(proxy, indent, cur, PASS_OUT, PHASE_UNMARSHAL); write_remoting_arguments(proxy, indent, cur, PASS_OUT, PHASE_UNMARSHAL);
if (has_ret) if (has_ret)
print_phase_basetype(proxy, indent, PHASE_UNMARSHAL, PASS_RETURN, def, "_RetVal"); {
if (decl_indirect(def->type))
print_proxy("MIDL_memset(&%s, 0, sizeof(%s));\n", "_RetVal", "_RetVal");
else if (is_ptr(def->type) || is_array(def->type))
print_proxy("%s = 0;\n", "_RetVal");
write_remoting_arguments(proxy, indent, cur, PASS_RETURN, PHASE_UNMARSHAL);
}
indent--; indent--;
print_proxy( "}\n"); print_proxy( "}\n");
......
...@@ -209,6 +209,9 @@ static void write_function_stubs(type_t *iface, unsigned int *proc_offset) ...@@ -209,6 +209,9 @@ static void write_function_stubs(type_t *iface, unsigned int *proc_offset)
{ {
write_remoting_arguments(server, indent, func, PASS_OUT, PHASE_BUFFERSIZE); write_remoting_arguments(server, indent, func, PASS_OUT, PHASE_BUFFERSIZE);
if (!is_void(def->type))
write_remoting_arguments(server, indent, func, PASS_RETURN, PHASE_BUFFERSIZE);
print_server("_pRpcMessage->BufferLength = _StubMsg.BufferLength;\n"); print_server("_pRpcMessage->BufferLength = _StubMsg.BufferLength;\n");
fprintf(server, "\n"); fprintf(server, "\n");
print_server("_Status = I_RpcGetBuffer(_pRpcMessage);\n"); print_server("_Status = I_RpcGetBuffer(_pRpcMessage);\n");
...@@ -226,7 +229,7 @@ static void write_function_stubs(type_t *iface, unsigned int *proc_offset) ...@@ -226,7 +229,7 @@ static void write_function_stubs(type_t *iface, unsigned int *proc_offset)
/* marshall the return value */ /* marshall the return value */
if (!is_void(def->type)) if (!is_void(def->type))
print_phase_basetype(server, indent, PHASE_MARSHAL, PASS_RETURN, def, "_RetVal"); write_remoting_arguments(server, indent, func, PASS_RETURN, PHASE_MARSHAL);
indent--; indent--;
print_server("}\n"); print_server("}\n");
...@@ -236,6 +239,9 @@ static void write_function_stubs(type_t *iface, unsigned int *proc_offset) ...@@ -236,6 +239,9 @@ static void write_function_stubs(type_t *iface, unsigned int *proc_offset)
write_remoting_arguments(server, indent, func, PASS_OUT, PHASE_FREE); write_remoting_arguments(server, indent, func, PASS_OUT, PHASE_FREE);
if (!is_void(def->type))
write_remoting_arguments(server, indent, func, PASS_RETURN, PHASE_FREE);
indent--; indent--;
print_server("}\n"); print_server("}\n");
print_server("RpcEndFinally\n"); print_server("RpcEndFinally\n");
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment