Alexandre Julliard : widl: Include the parent interfaces in the proc format string offsets for proxies .

Alexandre Julliard julliard at winehq.org
Tue Jun 14 11:57:45 CDT 2011


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

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Mon Jun 13 21:58:33 2011 +0200

widl: Include the parent interfaces in the proc format string offsets for proxies.

---

 tools/widl/proxy.c |   37 ++++++++++++++++++++++++++++++++++++-
 1 files changed, 36 insertions(+), 1 deletions(-)

diff --git a/tools/widl/proxy.c b/tools/widl/proxy.c
index 32a5054..5f17631 100644
--- a/tools/widl/proxy.c
+++ b/tools/widl/proxy.c
@@ -543,6 +543,36 @@ static const statement_t * get_callas_source(const type_t * iface, const var_t *
   return NULL;
 }
 
+static void write_proxy_procformatstring_offsets( const type_t *iface, int skip )
+{
+    const statement_t *stmt;
+
+    if (type_iface_get_inherit(iface))
+        write_proxy_procformatstring_offsets( type_iface_get_inherit(iface), need_delegation(iface));
+    else
+        return;
+
+    STATEMENTS_FOR_EACH_FUNC( stmt, type_iface_get_stmts(iface) )
+    {
+        const var_t *func = stmt->u.var;
+        int missing = 0;
+
+        if (is_callas(func->attrs)) continue;
+        if (is_local(func->attrs))
+        {
+            const statement_t * callas_source = get_callas_source(iface, func);
+            if (!callas_source)
+                missing = 1;
+            else
+                func = callas_source->u.var;
+        }
+        if (skip || missing)
+            print_proxy( "(unsigned short)-1,  /* %s::%s */\n", iface->name, get_name(func));
+        else
+            print_proxy( "%u,  /* %s::%s */\n", func->procstring_offset, iface->name, get_name(func));
+    }
+}
+
 static int write_proxy_methods(type_t *iface, int skip)
 {
   const statement_t *stmt;
@@ -667,7 +697,12 @@ static void write_proxy(type_t *iface, unsigned int *proc_offset)
 
   count = count_methods(iface);
 
-  write_procformatstring_offsets( proxy, iface );
+  print_proxy( "static const unsigned short %s_FormatStringOffsetTable[] =\n", iface->name );
+  print_proxy( "{\n" );
+  indent++;
+  write_proxy_procformatstring_offsets( iface, 0 );
+  indent--;
+  print_proxy( "};\n\n" );
 
   /* proxy info */
   if (get_stub_mode() == MODE_Oif)




More information about the wine-cvs mailing list