Alexandre Julliard : widl: Output vtable information even for interfaces that don' t define new functions.
Alexandre Julliard
julliard at winehq.org
Tue Dec 2 11:01:50 CST 2008
Module: wine
Branch: master
Commit: 61d600f42fc914947a6f37b1cc2dfd3b71b9e907
URL: http://source.winehq.org/git/wine.git/?a=commit;h=61d600f42fc914947a6f37b1cc2dfd3b71b9e907
Author: Alexandre Julliard <julliard at winehq.org>
Date: Mon Dec 1 14:51:17 2008 +0100
widl: Output vtable information even for interfaces that don't define new functions.
---
tools/widl/proxy.c | 33 +++++++++++++++++++++++----------
1 files changed, 23 insertions(+), 10 deletions(-)
diff --git a/tools/widl/proxy.c b/tools/widl/proxy.c
index 3c43aad..860b383 100644
--- a/tools/widl/proxy.c
+++ b/tools/widl/proxy.c
@@ -508,6 +508,18 @@ static void gen_stub(type_t *iface, const func_t *cur, const char *cas,
print_proxy("\n");
}
+static int count_methods(type_t *iface)
+{
+ const func_t *cur;
+ int count = 0;
+
+ if (iface->ref) count = count_methods(iface->ref);
+ if (iface->funcs)
+ LIST_FOR_EACH_ENTRY( cur, iface->funcs, const func_t, entry )
+ if (!is_callas(cur->def->attrs)) count++;
+ return count;
+}
+
static int write_proxy_methods(type_t *iface, int skip)
{
const func_t *cur;
@@ -548,17 +560,15 @@ static int write_stub_methods(type_t *iface, int skip)
static void write_proxy(type_t *iface, unsigned int *proc_offset)
{
- int midx = -1, stubs;
+ int midx = -1, count;
const func_t *cur;
- if (!iface->funcs) return;
-
/* FIXME: check for [oleautomation], shouldn't generate proxies/stubs if specified */
fprintf(proxy, "/*****************************************************************************\n");
fprintf(proxy, " * %s interface\n", iface->name);
fprintf(proxy, " */\n");
- LIST_FOR_EACH_ENTRY( cur, iface->funcs, const func_t, entry )
+ if (iface->funcs) LIST_FOR_EACH_ENTRY( cur, iface->funcs, const func_t, entry )
{
const var_t *def = cur->def;
if (!is_local(def->attrs)) {
@@ -583,8 +593,11 @@ static void write_proxy(type_t *iface, unsigned int *proc_offset)
}
}
+ count = count_methods(iface);
+ if (midx != -1 && midx != count) error("invalid count %u/%u\n", count, midx);
+
/* proxy vtable */
- print_proxy( "static const CINTERFACE_PROXY_VTABLE(%d) _%sProxyVtbl =\n", midx, iface->name);
+ print_proxy( "static const CINTERFACE_PROXY_VTABLE(%d) _%sProxyVtbl =\n", count, iface->name);
print_proxy( "{\n");
indent++;
print_proxy( "{\n", iface->name);
@@ -606,7 +619,7 @@ static void write_proxy(type_t *iface, unsigned int *proc_offset)
print_proxy( "static const PRPC_STUB_FUNCTION %s_table[] =\n", iface->name);
print_proxy( "{\n");
indent++;
- stubs = write_stub_methods(iface, FALSE);
+ write_stub_methods(iface, FALSE);
fprintf(proxy, "\n");
indent--;
fprintf(proxy, "};\n");
@@ -619,7 +632,7 @@ static void write_proxy(type_t *iface, unsigned int *proc_offset)
indent++;
print_proxy( "&IID_%s,\n", iface->name);
print_proxy( "0,\n");
- print_proxy( "%d,\n", stubs+3);
+ print_proxy( "%d,\n", count);
print_proxy( "&%s_table[-3],\n", iface->name);
indent--;
print_proxy( "},\n", iface->name);
@@ -700,7 +713,7 @@ static void write_proxy_iface_name_format(const statement_list_t *stmts, const c
else if (stmt->type == STMT_TYPE && stmt->u.type->type == RPC_FC_IP)
{
type_t *iface = stmt->u.type;
- if (iface->ref && iface->funcs && need_proxy(iface))
+ if (iface->ref && need_proxy(iface))
fprintf(proxy, format, iface->name);
}
}
@@ -718,7 +731,7 @@ static void write_proxy_iface_base_iids(const statement_list_t *stmts)
else if (stmt->type == STMT_TYPE && stmt->u.type->type == RPC_FC_IP)
{
type_t *iface = stmt->u.type;
- if (iface->ref && iface->funcs && need_proxy(iface))
+ if (iface->ref && need_proxy(iface))
{
if (need_delegation(iface))
fprintf( proxy, " &IID_%s, /* %s */\n", iface->ref->name, iface->name );
@@ -739,7 +752,7 @@ static void write_iid_lookup(const statement_list_t *stmts, const char *file_id,
else if (stmt->type == STMT_TYPE && stmt->u.type->type == RPC_FC_IP)
{
type_t *iface = stmt->u.type;
- if(iface->ref && iface->funcs && need_proxy(iface))
+ if(iface->ref && need_proxy(iface))
{
fprintf(proxy, " if (!_%s_CHECK_IID(%d))\n", file_id, *c);
fprintf(proxy, " {\n");
More information about the wine-cvs
mailing list