widl: Add a helper function for generating a stub that uses NdrClientCall.
This commit is contained in:
parent
d9fb7b9b92
commit
9f99d74a20
|
@ -97,43 +97,13 @@ static void write_function_stub( const type_t *iface, const var_t *func,
|
|||
unsigned char explicit_fc, implicit_fc;
|
||||
int has_full_pointer = is_full_pointer_function(func);
|
||||
type_t *rettype = type_function_get_rettype(func->type);
|
||||
const var_list_t *args = type_get_function_args(func->type);
|
||||
const var_t *handle_var = get_func_handle_var( iface, func, &explicit_fc, &implicit_fc );
|
||||
int has_ret = !is_void(rettype);
|
||||
|
||||
if (is_interpreted_func( iface, func ))
|
||||
{
|
||||
write_client_func_decl( iface, func );
|
||||
fprintf(client, "{\n");
|
||||
indent++;
|
||||
if (has_ret) print_client( "%s", "CLIENT_CALL_RETURN _RetVal;\n\n" );
|
||||
print_client( "%s%s( &%s_StubDesc, &__MIDL_ProcFormatString.Format[%u]",
|
||||
has_ret ? "_RetVal = " : "",
|
||||
get_stub_mode() == MODE_Oif ? "NdrClientCall2" : "NdrClientCall",
|
||||
iface->name, proc_offset );
|
||||
if (args)
|
||||
{
|
||||
const var_t *arg;
|
||||
if (pointer_size == 8)
|
||||
{
|
||||
LIST_FOR_EACH_ENTRY( arg, args, const var_t, entry )
|
||||
fprintf( client, ",\n%*s%s", 4 * indent + 16, "", arg->name );
|
||||
}
|
||||
else
|
||||
{
|
||||
arg = LIST_ENTRY( list_head(args), const var_t, entry );
|
||||
fprintf( client, ", &%s", arg->name );
|
||||
}
|
||||
}
|
||||
fprintf( client, " );\n" );
|
||||
if (has_ret)
|
||||
{
|
||||
print_client( "return (" );
|
||||
write_type_decl_left(client, rettype);
|
||||
fprintf( client, ")*(LONG_PTR *)&_RetVal;\n" );
|
||||
}
|
||||
indent--;
|
||||
print_client( "}\n\n");
|
||||
write_client_call_routine( client, iface, func, iface->name, proc_offset );
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
@ -266,31 +266,7 @@ static void gen_proxy(type_t *iface, const var_t *func, int idx,
|
|||
print_proxy( " %s %s_%s_Proxy(\n", callconv, iface->name, get_name(func));
|
||||
write_args(proxy, args, iface->name, 1, TRUE);
|
||||
print_proxy( ")\n");
|
||||
print_proxy( "{\n");
|
||||
indent++;
|
||||
if (has_ret) print_proxy( "%s", "CLIENT_CALL_RETURN _RetVal;\n\n" );
|
||||
print_proxy( "%s%s( &Object_StubDesc, &__MIDL_ProcFormatString.Format[%u],",
|
||||
has_ret ? "_RetVal = " : "",
|
||||
get_stub_mode() == MODE_Oif ? "NdrClientCall2" : "NdrClientCall",
|
||||
proc_offset );
|
||||
if (pointer_size == 8)
|
||||
{
|
||||
const var_t *arg;
|
||||
fprintf( proxy, "\n%*sThis", 4 * indent + 16, "" );
|
||||
if (args)
|
||||
LIST_FOR_EACH_ENTRY( arg, args, const var_t, entry )
|
||||
fprintf( proxy, ",\n%*s%s", 4 * indent + 16, "", arg->name );
|
||||
}
|
||||
else fprintf( proxy, " &This" );
|
||||
fprintf( proxy, " );\n" );
|
||||
if (has_ret)
|
||||
{
|
||||
print_proxy( "return (" );
|
||||
write_type_decl_left(proxy, rettype);
|
||||
fprintf( proxy, ")*(LONG_PTR *)&_RetVal;\n" );
|
||||
}
|
||||
indent--;
|
||||
print_proxy( "}\n\n");
|
||||
write_client_call_routine( proxy, iface, func, "Object", proc_offset );
|
||||
return;
|
||||
}
|
||||
print_proxy( "static void __finally_%s_%s_Proxy( struct __proxy_frame *__frame )\n",
|
||||
|
|
|
@ -4806,6 +4806,48 @@ error:
|
|||
error("Invalid endpoint syntax '%s'\n", endpoint->str);
|
||||
}
|
||||
|
||||
void write_client_call_routine( FILE *file, const type_t *iface, const var_t *func,
|
||||
const char *prefix, unsigned int proc_offset )
|
||||
{
|
||||
type_t *rettype = type_function_get_rettype( func->type );
|
||||
int has_ret = !is_void( rettype );
|
||||
const var_list_t *args = type_get_function_args( func->type );
|
||||
const var_t *arg;
|
||||
int len;
|
||||
|
||||
print_file( file, 0, "{\n");
|
||||
if (has_ret) print_file( file, 1, "%s", "CLIENT_CALL_RETURN _RetVal;\n\n" );
|
||||
len = fprintf( file, " %s%s( ",
|
||||
has_ret ? "_RetVal = " : "",
|
||||
get_stub_mode() == MODE_Oif ? "NdrClientCall2" : "NdrClientCall" );
|
||||
fprintf( file, "&%s_StubDesc,", prefix );
|
||||
fprintf( file, "\n%*s&__MIDL_ProcFormatString.Format[%u]", len, "", proc_offset );
|
||||
if (pointer_size == 8)
|
||||
{
|
||||
if (is_object( iface )) fprintf( file, ",\n%*sThis", len, "" );
|
||||
if (args)
|
||||
LIST_FOR_EACH_ENTRY( arg, args, const var_t, entry )
|
||||
fprintf( file, ",\n%*s%s", len, "", arg->name );
|
||||
}
|
||||
else
|
||||
{
|
||||
if (is_object( iface )) fprintf( file, ",\n%*s&This", len, "" );
|
||||
else if (args)
|
||||
{
|
||||
arg = LIST_ENTRY( list_head(args), const var_t, entry );
|
||||
fprintf( file, ",\n%*s&%s", len, "", arg->name );
|
||||
}
|
||||
}
|
||||
fprintf( file, " );\n" );
|
||||
if (has_ret)
|
||||
{
|
||||
print_file( file, 1, "return (" );
|
||||
write_type_decl_left(file, rettype);
|
||||
fprintf( file, ")%s;\n", pointer_size == 8 ? "_RetVal.Simple" : "*(LONG_PTR *)&_RetVal" );
|
||||
}
|
||||
print_file( file, 0, "}\n\n");
|
||||
}
|
||||
|
||||
void write_exceptions( FILE *file )
|
||||
{
|
||||
fprintf( file, "#ifndef USE_COMPILER_EXCEPTIONS\n");
|
||||
|
|
|
@ -80,6 +80,8 @@ int write_expr_eval_routines(FILE *file, const char *iface);
|
|||
void write_expr_eval_routine_list(FILE *file, const char *iface);
|
||||
void write_user_quad_list(FILE *file);
|
||||
void write_endpoints( FILE *f, const char *prefix, const str_list_t *list );
|
||||
void write_client_call_routine( FILE *file, const type_t *iface, const var_t *func,
|
||||
const char *prefix, unsigned int proc_offset );
|
||||
void write_exceptions( FILE *file );
|
||||
unsigned int type_memsize(const type_t *t);
|
||||
int decl_indirect(const type_t *t);
|
||||
|
|
Loading…
Reference in New Issue