Dan Hipschman : widl: Encode coclass types in typelibs.

Alexandre Julliard julliard at wine.codeweavers.com
Sat Jul 29 05:22:19 CDT 2006


Module: wine
Branch: refs/heads/master
Commit: 678ce9875f8e13c559caf457bccab6811a1cf082
URL:    http://source.winehq.org/git/?p=wine.git;a=commit;h=678ce9875f8e13c559caf457bccab6811a1cf082

Author: Dan Hipschman <dsh at linux.ucla.edu>
Date:   Fri Jul 28 13:45:33 2006 -0700

widl: Encode coclass types in typelibs.

---

 tools/widl/parser.y     |    3 +++
 tools/widl/widltypes.h  |    4 +++-
 tools/widl/write_msft.c |    7 ++++++-
 3 files changed, 12 insertions(+), 2 deletions(-)

diff --git a/tools/widl/parser.y b/tools/widl/parser.y
index a4efb66..b8e1c39 100644
--- a/tools/widl/parser.y
+++ b/tools/widl/parser.y
@@ -638,6 +638,7 @@ int_std:  tINT					{ $$ = make_type(RPC_
 coclass:  tCOCLASS aIDENTIFIER			{ $$ = make_class($2); }
 	| tCOCLASS aKNOWNTYPE			{ $$ = find_type($2, 0);
 						  if ($$->defined) yyerror("multiple definition error");
+						  if ($$->kind != TKIND_COCLASS) yyerror("%s was not declared a coclass", $2);
 						}
 	;
 
@@ -1060,6 +1061,7 @@ static type_t *make_type(unsigned char t
 {
   type_t *t = xmalloc(sizeof(type_t));
   t->name = NULL;
+  t->kind = TKIND_PRIMITIVE;
   t->type = type;
   t->ref = ref;
   t->attrs = NULL;
@@ -1153,6 +1155,7 @@ static type_t *make_class(char *name)
 {
   type_t *c = make_type(0, NULL);
   c->name = name;
+  c->kind = TKIND_COCLASS;
   INIT_LINK(c);
   return c;
 }
diff --git a/tools/widl/widltypes.h b/tools/widl/widltypes.h
index 84a2fc2..7bf2229 100644
--- a/tools/widl/widltypes.h
+++ b/tools/widl/widltypes.h
@@ -160,7 +160,8 @@ enum expr_type
 
 enum type_kind
 {
-    TKIND_ENUM = 0,
+    TKIND_PRIMITIVE = -1,
+    TKIND_ENUM,
     TKIND_RECORD,
     TKIND_MODULE,
     TKIND_INTERFACE,
@@ -199,6 +200,7 @@ struct _expr_t {
 
 struct _type_t {
   const char *name;
+  enum type_kind kind;
   unsigned char type;
   struct _type_t *ref;
   const attr_t *attrs;
diff --git a/tools/widl/write_msft.c b/tools/widl/write_msft.c
index f2800d8..8148a93 100644
--- a/tools/widl/write_msft.c
+++ b/tools/widl/write_msft.c
@@ -740,6 +740,7 @@ static importinfo_t *find_importinfo(msf
 static void add_structure_typeinfo(msft_typelib_t *typelib, type_t *structure);
 static void add_interface_typeinfo(msft_typelib_t *typelib, type_t *interface);
 static void add_enum_typeinfo(msft_typelib_t *typelib, type_t *enumeration);
+static void add_coclass_typeinfo(msft_typelib_t *typelib, type_t *cls);
 
 
 /****************************************************************************
@@ -973,7 +974,11 @@ #endif
                 add_enum_typeinfo(typelib, type);
                 break;
             case 0:
-                error("encode_type: VT_USERDEFINED - can't yet add typedef's on the fly\n");
+                if (type->kind == TKIND_COCLASS)
+                    add_coclass_typeinfo(typelib, type);
+                else
+                    error("encode_type: VT_USERDEFINED - can't yet add typedef's on the fly\n");
+                break;
             default:
                 error("encode_type: VT_USERDEFINED - unhandled type %d\n", type->type);
             }




More information about the wine-cvs mailing list