Rob Shearman : widl: Detect interfaces that inherit from another interface as objects.

Alexandre Julliard julliard at winehq.org
Mon Nov 30 10:42:42 CST 2009


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

Author: Rob Shearman <robertshearman at gmail.com>
Date:   Wed Nov 25 09:53:49 2009 +0000

widl: Detect interfaces that inherit from another interface as objects.

---

 tools/widl/header.c |   12 +++++++-----
 tools/widl/header.h |    2 +-
 tools/widl/parser.y |    4 ++--
 tools/widl/proxy.c  |    4 ++--
 tools/widl/widl.c   |    2 +-
 5 files changed, 13 insertions(+), 11 deletions(-)

diff --git a/tools/widl/header.c b/tools/widl/header.c
index c8b9613..5602b6d 100644
--- a/tools/widl/header.c
+++ b/tools/widl/header.c
@@ -691,10 +691,12 @@ int has_out_arg_or_return(const var_t *func)
 
 /********** INTERFACES **********/
 
-int is_object(const attr_list_t *list)
+int is_object(const type_t *iface)
 {
     const attr_t *attr;
-    if (list) LIST_FOR_EACH_ENTRY( attr, list, const attr_t, entry )
+    if (type_is_defined(iface) && type_iface_get_inherit(iface))
+        return 1;
+    if (iface->attrs) LIST_FOR_EACH_ENTRY( attr, iface->attrs, const attr_t, entry )
         if (attr->type == ATTR_OBJECT || attr->type == ATTR_ODL) return 1;
     return 0;
 }
@@ -866,7 +868,7 @@ static void write_locals(FILE *fp, const type_t *iface, int body)
     = "/* WIDL-generated stub.  You must provide an implementation for this.  */";
   const statement_t *stmt;
 
-  if (!is_object(iface->attrs))
+  if (!is_object(iface))
     return;
 
   STATEMENTS_FOR_EACH_FUNC(stmt, type_iface_get_stmts(iface)) {
@@ -1180,7 +1182,7 @@ static void write_forward_decls(FILE *header, const statement_list_t *stmts)
       case STMT_TYPE:
         if (type_get_type(stmt->u.type) == TYPE_INTERFACE)
         {
-          if (is_object(stmt->u.type->attrs) || is_attr(stmt->u.type->attrs, ATTR_DISPINTERFACE))
+          if (is_object(stmt->u.type) || is_attr(stmt->u.type->attrs, ATTR_DISPINTERFACE))
             write_forward(header, stmt->u.type);
         }
         else if (type_get_type(stmt->u.type) == TYPE_COCLASS)
@@ -1215,7 +1217,7 @@ static void write_header_stmts(FILE *header, const statement_list_t *stmts, cons
         if (type_get_type(stmt->u.type) == TYPE_INTERFACE)
         {
           type_t *iface = stmt->u.type;
-          if (is_attr(stmt->u.type->attrs, ATTR_DISPINTERFACE) || is_object(stmt->u.type->attrs))
+          if (is_attr(stmt->u.type->attrs, ATTR_DISPINTERFACE) || is_object(stmt->u.type))
           {
             write_com_interface_start(header, iface);
             write_header_stmts(header, type_iface_get_stmts(iface), stmt->u.type, TRUE);
diff --git a/tools/widl/header.h b/tools/widl/header.h
index d4b3b88..7d6c543 100644
--- a/tools/widl/header.h
+++ b/tools/widl/header.h
@@ -38,7 +38,7 @@ extern void write_type_def_or_decl(FILE *h, type_t *t, int is_field, const char
 extern void write_type_decl(FILE *f, type_t *t, const char *name);
 extern void write_type_decl_left(FILE *f, type_t *t);
 extern int needs_space_after(type_t *t);
-extern int is_object(const attr_list_t *list);
+extern int is_object(const type_t *iface);
 extern int is_local(const attr_list_t *list);
 extern int need_stub(const type_t *iface);
 extern int need_proxy(const type_t *iface);
diff --git a/tools/widl/parser.y b/tools/widl/parser.y
index 73b48a2..dda4a37 100644
--- a/tools/widl/parser.y
+++ b/tools/widl/parser.y
@@ -841,7 +841,7 @@ dispinterfacedef: dispinterfacehdr '{'
 	;
 
 inherit:					{ $$ = NULL; }
-	| ':' aKNOWNTYPE			{ $$ = find_type_or_error2($2, 0); }
+	| ':' aKNOWNTYPE			{ $$ = find_type_or_error2($2, 0); is_object_interface = 1; }
 	;
 
 interface: tINTERFACE aIDENTIFIER		{ $$ = get_type(TYPE_INTERFACE, $2, 0); }
@@ -852,9 +852,9 @@ interfacehdr: attributes interface		{ $$.interface = $2;
 						  $$.old_pointer_default = pointer_default;
 						  if (is_attr($1, ATTR_POINTERDEFAULT))
 						    pointer_default = get_attrv($1, ATTR_POINTERDEFAULT);
-						  is_object_interface = is_object($1);
 						  check_def($2);
 						  $2->attrs = check_iface_attrs($2->name, $1);
+						  is_object_interface = is_object($2);
 						  $2->defined = TRUE;
 						}
 	;
diff --git a/tools/widl/proxy.c b/tools/widl/proxy.c
index cc753bb..de8e466 100644
--- a/tools/widl/proxy.c
+++ b/tools/widl/proxy.c
@@ -698,12 +698,12 @@ static int does_any_iface(const statement_list_t *stmts, type_pred_t pred)
 
 int need_proxy(const type_t *iface)
 {
-  return is_object(iface->attrs) && !is_local(iface->attrs);
+  return is_object(iface) && !is_local(iface->attrs);
 }
 
 int need_stub(const type_t *iface)
 {
-  return !is_object(iface->attrs) && !is_local(iface->attrs);
+  return !is_object(iface) && !is_local(iface->attrs);
 }
 
 int need_proxy_file(const statement_list_t *stmts)
diff --git a/tools/widl/widl.c b/tools/widl/widl.c
index c1c3832..a481c56 100644
--- a/tools/widl/widl.c
+++ b/tools/widl/widl.c
@@ -431,7 +431,7 @@ static void write_id_data_stmts(const statement_list_t *stmts)
       if (type_get_type(type) == TYPE_INTERFACE)
       {
         const UUID *uuid;
-        if (!is_object(type->attrs) && !is_attr(type->attrs, ATTR_DISPINTERFACE))
+        if (!is_object(type) && !is_attr(type->attrs, ATTR_DISPINTERFACE))
           continue;
         uuid = get_attrp(type->attrs, ATTR_UUID);
         write_guid(idfile, is_attr(type->attrs, ATTR_DISPINTERFACE) ? "DIID" : "IID",




More information about the wine-cvs mailing list