Rob Shearman : widl: Add function for getting the interfaces defined by a coclass type.

Alexandre Julliard julliard at winehq.org
Tue Jan 6 08:23:16 CST 2009


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

Author: Rob Shearman <robertshearman at gmail.com>
Date:   Mon Jan  5 23:34:38 2009 +0000

widl: Add function for getting the interfaces defined by a coclass type.

Split out the defining of coclass types in the parser into a function.

---

 tools/widl/parser.y     |    5 +----
 tools/widl/typetree.c   |    7 +++++++
 tools/widl/typetree.h   |    7 +++++++
 tools/widl/write_msft.c |    6 ++++--
 4 files changed, 19 insertions(+), 6 deletions(-)

diff --git a/tools/widl/parser.y b/tools/widl/parser.y
index 2820f45..b8e1d4d 100644
--- a/tools/widl/parser.y
+++ b/tools/widl/parser.y
@@ -830,10 +830,7 @@ coclasshdr: attributes coclass			{ $$ = $2;
 	;
 
 coclassdef: coclasshdr '{' coclass_ints '}' semicolon_opt
-						{ $$ = $1;
-						  $$->ifaces = $3;
-						  $$->defined = TRUE;
-						}
+						{ $$ = type_coclass_define($1, $3); }
 	;
 
 coclass_ints:					{ $$ = NULL; }
diff --git a/tools/widl/typetree.c b/tools/widl/typetree.c
index 54859be..8a42d56 100644
--- a/tools/widl/typetree.c
+++ b/tools/widl/typetree.c
@@ -137,3 +137,10 @@ void type_module_define(type_t *module, statement_list_t *stmts)
     module->details.module->stmts = stmts;
     module->defined = TRUE;
 }
+
+type_t *type_coclass_define(type_t *coclass, ifref_list_t *ifaces)
+{
+    coclass->ifaces = ifaces;
+    coclass->defined = TRUE;
+    return coclass;
+}
diff --git a/tools/widl/typetree.h b/tools/widl/typetree.h
index 0fcfb3a..af4d5e6 100644
--- a/tools/widl/typetree.h
+++ b/tools/widl/typetree.h
@@ -32,6 +32,7 @@ void type_interface_define(type_t *iface, type_t *inherit, statement_list_t *stm
 void type_dispinterface_define(type_t *iface, var_list_t *props, func_list_t *methods);
 void type_dispinterface_define_from_iface(type_t *dispiface, type_t *iface);
 void type_module_define(type_t *module, statement_list_t *stmts);
+type_t *type_coclass_define(type_t *coclass, ifref_list_t *ifaces);
 
 /* FIXME: shouldn't need to export this */
 type_t *duptype(type_t *t, int dupname);
@@ -153,4 +154,10 @@ static inline int type_is_alias(const type_t *type)
     return type->is_alias;
 }
 
+static inline ifref_list_t *type_coclass_get_ifaces(const type_t *type)
+{
+    assert(type->type == RPC_FC_COCLASS);
+    return type->ifaces;
+}
+
 #endif /* WIDL_TYPE_TREE_H */
diff --git a/tools/widl/write_msft.c b/tools/widl/write_msft.c
index d7bbd60..bf95b13 100644
--- a/tools/widl/write_msft.c
+++ b/tools/widl/write_msft.c
@@ -2099,6 +2099,7 @@ static void add_coclass_typeinfo(msft_typelib_t *typelib, type_t *cls)
     MSFT_RefRecord *ref, *first = NULL, *first_source = NULL;
     int have_default = 0, have_default_source = 0;
     const attr_t *attr;
+    ifref_list_t *ifaces;
 
     if (-1 < cls->typelib_idx)
         return;
@@ -2106,13 +2107,14 @@ static void add_coclass_typeinfo(msft_typelib_t *typelib, type_t *cls)
     cls->typelib_idx = typelib->typelib_header.nrtypeinfos;
     msft_typeinfo = create_msft_typeinfo(typelib, TKIND_COCLASS, cls->name, cls->attrs);
 
-    if (cls->ifaces) LIST_FOR_EACH_ENTRY( iref, cls->ifaces, ifref_t, entry ) num_ifaces++;
+    ifaces = type_coclass_get_ifaces(cls);
+    if (ifaces) LIST_FOR_EACH_ENTRY( iref, ifaces, ifref_t, entry ) num_ifaces++;
 
     offset = msft_typeinfo->typeinfo->datatype1 = ctl2_alloc_segment(typelib, MSFT_SEG_REFERENCES,
                                                                      num_ifaces * sizeof(*ref), 0);
 
     i = 0;
-    if (cls->ifaces) LIST_FOR_EACH_ENTRY( iref, cls->ifaces, ifref_t, entry ) {
+    if (ifaces) LIST_FOR_EACH_ENTRY( iref, ifaces, ifref_t, entry ) {
         if(iref->iface->typelib_idx == -1)
             add_interface_typeinfo(typelib, iref->iface);
         ref = (MSFT_RefRecord*) (typelib->typelib_segment_data[MSFT_SEG_REFERENCES] + offset + i * sizeof(*ref));




More information about the wine-cvs mailing list