Alexandre Julliard : widl: Add a helper function for generating a stub that uses NdrClientCall.

Alexandre Julliard julliard at winehq.org
Thu Jun 9 11:47:38 CDT 2011


Module: wine
Branch: master
Commit: 9f99d74a2037524ae8502de071564da3396eb3ab
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=9f99d74a2037524ae8502de071564da3396eb3ab

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Thu Jun  9 10:12:48 2011 +0200

widl: Add a helper function for generating a stub that uses NdrClientCall.

---

 tools/widl/client.c  |   32 +-------------------------------
 tools/widl/proxy.c   |   26 +-------------------------
 tools/widl/typegen.c |   42 ++++++++++++++++++++++++++++++++++++++++++
 tools/widl/typegen.h |    2 ++
 4 files changed, 46 insertions(+), 56 deletions(-)

diff --git a/tools/widl/client.c b/tools/widl/client.c
index 0ea8cbc..30f24b3 100644
--- a/tools/widl/client.c
+++ b/tools/widl/client.c
@@ -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;
     }
 
diff --git a/tools/widl/proxy.c b/tools/widl/proxy.c
index 549bfaa..0043e6a 100644
--- a/tools/widl/proxy.c
+++ b/tools/widl/proxy.c
@@ -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",
diff --git a/tools/widl/typegen.c b/tools/widl/typegen.c
index 59de872..abe84d9 100644
--- a/tools/widl/typegen.c
+++ b/tools/widl/typegen.c
@@ -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");
diff --git a/tools/widl/typegen.h b/tools/widl/typegen.h
index 7f3aed1..6c7242e 100644
--- a/tools/widl/typegen.h
+++ b/tools/widl/typegen.h
@@ -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);




More information about the wine-cvs mailing list