widl: Fix ExprEvalRoutines output

Dan Hipschman dsh at linux.ucla.edu
Fri Oct 26 17:33:13 CDT 2007


This patch adds outputting of expression evaluation routines (used for
conformant array size calculations and things like that) to the proxy
files.  It also corrects the handling of these in the client and server
stub files.  Without this, they are being processed for each interface.
That could lead to incorrect code or callback offsets with more than
one interface.

---
 tools/widl/client.c |   12 +++++-------
 tools/widl/proxy.c  |   10 +++++++---
 tools/widl/server.c |   13 +++++--------
 3 files changed, 17 insertions(+), 18 deletions(-)

diff --git a/tools/widl/client.c b/tools/widl/client.c
index 2d48d7a..696dd83 100644
--- a/tools/widl/client.c
+++ b/tools/widl/client.c
@@ -386,6 +386,7 @@ static void init_client(void)
 void write_client(ifref_list_t *ifaces)
 {
     unsigned int proc_offset = 0;
+    int expr_eval_routines;
     ifref_t *iface;
 
     if (!do_client)
@@ -398,6 +399,10 @@ void write_client(ifref_list_t *ifaces)
         return;
 
     write_formatstringsdecl(client, indent, ifaces, need_stub);
+    expr_eval_routines = write_expr_eval_routines(client, client_token);
+    if (expr_eval_routines)
+        write_expr_eval_routine_list(client, client_token);
+    write_user_quad_list(client);
 
     if (ifaces) LIST_FOR_EACH_ENTRY( iface, ifaces, ifref_t, entry )
     {
@@ -411,8 +416,6 @@ void write_client(ifref_list_t *ifaces)
 
         if (iface->iface->funcs)
         {
-            int expr_eval_routines;
-
             write_implicithandledecl(iface->iface);
     
             write_clientinterfacedecl(iface->iface);
@@ -424,11 +427,6 @@ void write_client(ifref_list_t *ifaces)
             print_client("#endif\n");
 
             fprintf(client, "\n");
-
-            expr_eval_routines = write_expr_eval_routines(client, iface->iface->name);
-            if (expr_eval_routines)
-                write_expr_eval_routine_list(client, iface->iface->name);
-            write_user_quad_list(client);
             write_stubdescriptor(iface->iface, expr_eval_routines);
         }
     }
diff --git a/tools/widl/proxy.c b/tools/widl/proxy.c
index 3c8d6ef..aa9fe11 100644
--- a/tools/widl/proxy.c
+++ b/tools/widl/proxy.c
@@ -65,14 +65,14 @@ static void write_stubdescproto(void)
   print_proxy( "\n");
 }
 
-static void write_stubdesc(void)
+static void write_stubdesc(int expr_eval_routines)
 {
   print_proxy( "static const MIDL_STUB_DESC Object_StubDesc =\n{\n");
   indent++;
   print_proxy( "0,\n");
   print_proxy( "NdrOleAllocate,\n");
   print_proxy( "NdrOleFree,\n");
-  print_proxy( "{0}, 0, 0, 0, 0,\n");
+  print_proxy( "{0}, 0, 0, %s, 0,\n", expr_eval_routines ? "ExprEvalRoutines" : "0");
   print_proxy( "__MIDL_TypeFormatString.Format,\n");
   print_proxy( "1, /* -error bounds_check flag */\n");
   print_proxy( "0x10001, /* Ndr library version */\n");
@@ -598,6 +598,7 @@ int need_stub_files(const ifref_list_t *ifaces)
 void write_proxies(ifref_list_t *ifaces)
 {
   ifref_t *cur;
+  int expr_eval_routines;
   char *file_id = proxy_token;
   int c;
   unsigned int proc_offset = 0;
@@ -613,8 +614,11 @@ void write_proxies(ifref_list_t *ifaces)
           if (need_proxy(cur->iface))
               write_proxy(cur->iface, &proc_offset);
 
+  expr_eval_routines = write_expr_eval_routines(proxy, proxy_token);
+  if (expr_eval_routines)
+      write_expr_eval_routine_list(proxy, proxy_token);
   write_user_quad_list(proxy);
-  write_stubdesc();
+  write_stubdesc(expr_eval_routines);
 
   print_proxy( "#if !defined(__RPC_WIN32__)\n");
   print_proxy( "#error Currently only Wine and WIN32 are supported.\n");
diff --git a/tools/widl/server.c b/tools/widl/server.c
index 49ceb69..a52c729 100644
--- a/tools/widl/server.c
+++ b/tools/widl/server.c
@@ -399,6 +399,7 @@ static void init_server(void)
 void write_server(ifref_list_t *ifaces)
 {
     unsigned int proc_offset = 0;
+    int expr_eval_routines;
     ifref_t *iface;
 
     if (!do_server)
@@ -411,6 +412,10 @@ void write_server(ifref_list_t *ifaces)
         return;
 
     write_formatstringsdecl(server, indent, ifaces, need_stub);
+    expr_eval_routines = write_expr_eval_routines(server, server_token);
+    if (expr_eval_routines)
+        write_expr_eval_routine_list(server, server_token);
+    write_user_quad_list(server);
 
     if (ifaces) LIST_FOR_EACH_ENTRY( iface, ifaces, ifref_t, entry )
     {
@@ -424,8 +429,6 @@ void write_server(ifref_list_t *ifaces)
 
         if (iface->iface->funcs)
         {
-            int expr_eval_routines;
-
             write_serverinterfacedecl(iface->iface);
             write_stubdescdecl(iface->iface);
     
@@ -436,12 +439,6 @@ void write_server(ifref_list_t *ifaces)
             print_server("#endif\n");
 
             fprintf(server, "\n");
-
-            expr_eval_routines = write_expr_eval_routines(server, iface->iface->name);
-            if (expr_eval_routines)
-                write_expr_eval_routine_list(server, iface->iface->name);
-
-            write_user_quad_list(server);
             write_stubdescriptor(iface->iface, expr_eval_routines);
             write_dispatchtable(iface->iface);
         }



More information about the wine-patches mailing list