widl: Encode coclass types in typelibs.
This commit is contained in:
parent
9265d77584
commit
678ce9875f
@ -638,6 +638,7 @@ int_std: tINT { $$ = make_type(RPC_FC_LONG, &std_int); } /* win32 only */
|
|||||||
coclass: tCOCLASS aIDENTIFIER { $$ = make_class($2); }
|
coclass: tCOCLASS aIDENTIFIER { $$ = make_class($2); }
|
||||||
| tCOCLASS aKNOWNTYPE { $$ = find_type($2, 0);
|
| tCOCLASS aKNOWNTYPE { $$ = find_type($2, 0);
|
||||||
if ($$->defined) yyerror("multiple definition error");
|
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));
|
type_t *t = xmalloc(sizeof(type_t));
|
||||||
t->name = NULL;
|
t->name = NULL;
|
||||||
|
t->kind = TKIND_PRIMITIVE;
|
||||||
t->type = type;
|
t->type = type;
|
||||||
t->ref = ref;
|
t->ref = ref;
|
||||||
t->attrs = NULL;
|
t->attrs = NULL;
|
||||||
@ -1153,6 +1155,7 @@ static type_t *make_class(char *name)
|
|||||||
{
|
{
|
||||||
type_t *c = make_type(0, NULL);
|
type_t *c = make_type(0, NULL);
|
||||||
c->name = name;
|
c->name = name;
|
||||||
|
c->kind = TKIND_COCLASS;
|
||||||
INIT_LINK(c);
|
INIT_LINK(c);
|
||||||
return c;
|
return c;
|
||||||
}
|
}
|
||||||
|
@ -160,7 +160,8 @@ enum expr_type
|
|||||||
|
|
||||||
enum type_kind
|
enum type_kind
|
||||||
{
|
{
|
||||||
TKIND_ENUM = 0,
|
TKIND_PRIMITIVE = -1,
|
||||||
|
TKIND_ENUM,
|
||||||
TKIND_RECORD,
|
TKIND_RECORD,
|
||||||
TKIND_MODULE,
|
TKIND_MODULE,
|
||||||
TKIND_INTERFACE,
|
TKIND_INTERFACE,
|
||||||
@ -199,6 +200,7 @@ struct _expr_t {
|
|||||||
|
|
||||||
struct _type_t {
|
struct _type_t {
|
||||||
const char *name;
|
const char *name;
|
||||||
|
enum type_kind kind;
|
||||||
unsigned char type;
|
unsigned char type;
|
||||||
struct _type_t *ref;
|
struct _type_t *ref;
|
||||||
const attr_t *attrs;
|
const attr_t *attrs;
|
||||||
|
@ -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_structure_typeinfo(msft_typelib_t *typelib, type_t *structure);
|
||||||
static void add_interface_typeinfo(msft_typelib_t *typelib, type_t *interface);
|
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_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);
|
add_enum_typeinfo(typelib, type);
|
||||||
break;
|
break;
|
||||||
case 0:
|
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:
|
default:
|
||||||
error("encode_type: VT_USERDEFINED - unhandled type %d\n", type->type);
|
error("encode_type: VT_USERDEFINED - unhandled type %d\n", type->type);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user