From 678ce9875f8e13c559caf457bccab6811a1cf082 Mon Sep 17 00:00:00 2001 From: Dan Hipschman Date: Fri, 28 Jul 2006 13:45:33 -0700 Subject: [PATCH] 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 a4efb66dc0f..b8e1c397a2d 100644 --- a/tools/widl/parser.y +++ b/tools/widl/parser.y @@ -638,6 +638,7 @@ int_std: tINT { $$ = make_type(RPC_FC_LONG, &std_int); } /* win32 only */ 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 type, type_t *ref) { 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 84a2fc2b90d..7bf22291994 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 f2800d8cc99..8148a93dd70 100644 --- a/tools/widl/write_msft.c +++ b/tools/widl/write_msft.c @@ -740,6 +740,7 @@ static importinfo_t *find_importinfo(msft_typelib_t *typelib, const char *name) 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 @@ static int encode_type( 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); } -- 2.11.4.GIT