Rob Shearman : widl: Use type_get_type to determine the types of types during typelib generation .
Alexandre Julliard
julliard at winehq.org
Mon Feb 23 10:00:50 CST 2009
Module: wine
Branch: master
Commit: 28a2c06cf7a32dee66000b15a334c3366c77ae35
URL: http://source.winehq.org/git/wine.git/?a=commit;h=28a2c06cf7a32dee66000b15a334c3366c77ae35
Author: Rob Shearman <robertshearman at gmail.com>
Date: Mon Feb 23 13:48:21 2009 +0000
widl: Use type_get_type to determine the types of types during typelib generation.
---
tools/widl/typelib.c | 129 ++++++++++++++++++++++++----------------------
tools/widl/write_msft.c | 64 +++++++----------------
2 files changed, 87 insertions(+), 106 deletions(-)
diff --git a/tools/widl/typelib.c b/tools/widl/typelib.c
index 047a179..d6a2e2e 100644
--- a/tools/widl/typelib.c
+++ b/tools/widl/typelib.c
@@ -109,17 +109,20 @@ static unsigned short builtin_vt(const type_t *t)
}
if (is_string_type (t->attrs, t))
{
- unsigned char fc;
+ const type_t *elem_type;
if (is_array(t))
- fc = type_array_get_element(t)->type;
+ elem_type = type_array_get_element(t);
else
- fc = type_pointer_get_ref(t)->type;
- switch (fc)
+ elem_type = type_pointer_get_ref(t);
+ if (type_get_type(elem_type) == TYPE_BASIC)
+ {
+ switch (type_basic_get_fc(elem_type))
{
case RPC_FC_CHAR: return VT_LPSTR;
case RPC_FC_WCHAR: return VT_LPWSTR;
default: break;
}
+ }
}
return 0;
}
@@ -143,74 +146,76 @@ unsigned short get_type_vt(type_t *t)
if (type_is_alias(t) && is_attr(t->attrs, ATTR_PUBLIC))
return VT_USERDEFINED;
- switch (t->type) {
- case RPC_FC_BYTE:
- case RPC_FC_USMALL:
- return VT_UI1;
- case RPC_FC_CHAR:
- case RPC_FC_SMALL:
- return VT_I1;
- case RPC_FC_WCHAR:
- return VT_I2; /* mktyplib seems to parse wchar_t as short */
- case RPC_FC_SHORT:
- return VT_I2;
- case RPC_FC_USHORT:
- return VT_UI2;
- case RPC_FC_LONG:
- if (match(t->name, "int")) return VT_INT;
- return VT_I4;
- case RPC_FC_ULONG:
- if (match(t->name, "int")) return VT_UINT;
- return VT_UI4;
- case RPC_FC_HYPER:
- if (t->sign < 0) return VT_UI8;
- if (match(t->name, "MIDL_uhyper")) return VT_UI8;
- return VT_I8;
- case RPC_FC_FLOAT:
- return VT_R4;
- case RPC_FC_DOUBLE:
- return VT_R8;
- case RPC_FC_RP:
- case RPC_FC_UP:
- case RPC_FC_OP:
- case RPC_FC_FP:
- case RPC_FC_SMFARRAY:
- case RPC_FC_LGFARRAY:
- case RPC_FC_SMVARRAY:
- case RPC_FC_LGVARRAY:
- case RPC_FC_CARRAY:
- case RPC_FC_CVARRAY:
- case RPC_FC_BOGUS_ARRAY:
- if(t->ref)
- {
- if (match(t->ref->name, "SAFEARRAY"))
- return VT_SAFEARRAY;
- return VT_PTR;
+ switch (type_get_type(t)) {
+ case TYPE_BASIC:
+ switch (type_basic_get_fc(t)) {
+ case RPC_FC_BYTE:
+ case RPC_FC_USMALL:
+ return VT_UI1;
+ case RPC_FC_CHAR:
+ case RPC_FC_SMALL:
+ return VT_I1;
+ case RPC_FC_WCHAR:
+ return VT_I2; /* mktyplib seems to parse wchar_t as short */
+ case RPC_FC_SHORT:
+ return VT_I2;
+ case RPC_FC_USHORT:
+ return VT_UI2;
+ case RPC_FC_LONG:
+ if (match(t->name, "int")) return VT_INT;
+ return VT_I4;
+ case RPC_FC_ULONG:
+ if (match(t->name, "int")) return VT_UINT;
+ return VT_UI4;
+ case RPC_FC_HYPER:
+ if (t->sign < 0) return VT_UI8;
+ if (match(t->name, "MIDL_uhyper")) return VT_UI8;
+ return VT_I8;
+ case RPC_FC_FLOAT:
+ return VT_R4;
+ case RPC_FC_DOUBLE:
+ return VT_R8;
+ default:
+ error("get_type_vt: unknown basic type: 0x%02x\n", type_basic_get_fc(t));
}
-
- error("get_type_vt: unknown-deref-type: %d\n", t->ref->type);
break;
- case RPC_FC_IP:
+
+ case TYPE_POINTER:
+ if (match(type_pointer_get_ref(t)->name, "SAFEARRAY"))
+ return VT_SAFEARRAY;
+ return VT_PTR;
+
+ case TYPE_ARRAY:
+ if (t->declarray)
+ error("get_type_vt: array types not supported\n");
+ return VT_PTR;
+
+ case TYPE_INTERFACE:
if(match(t->name, "IUnknown"))
return VT_UNKNOWN;
if(match(t->name, "IDispatch"))
return VT_DISPATCH;
return VT_USERDEFINED;
- case RPC_FC_ENUM16:
- case RPC_FC_STRUCT:
- case RPC_FC_PSTRUCT:
- case RPC_FC_CSTRUCT:
- case RPC_FC_CPSTRUCT:
- case RPC_FC_CVSTRUCT:
- case RPC_FC_BOGUS_STRUCT:
- case RPC_FC_COCLASS:
- case RPC_FC_MODULE:
+ case TYPE_ENUM:
+ case TYPE_STRUCT:
+ case TYPE_COCLASS:
+ case TYPE_MODULE:
+ case TYPE_UNION:
+ case TYPE_ENCAPSULATED_UNION:
return VT_USERDEFINED;
- case 0:
+
+ case TYPE_VOID:
return VT_VOID;
- default:
- error("get_type_vt: unknown type: 0x%02x\n", t->type);
+
+ case TYPE_ALIAS:
+ /* aliases should be filtered out by the type_get_type call above */
+ assert(0);
+ break;
+
+ case TYPE_FUNCTION:
+ error("get_type_vt: functions not supported\n");
+ break;
}
return 0;
}
diff --git a/tools/widl/write_msft.c b/tools/widl/write_msft.c
index 107d0bf..a92325a 100644
--- a/tools/widl/write_msft.c
+++ b/tools/widl/write_msft.c
@@ -983,34 +983,27 @@ static int encode_type(
while (type->typelib_idx < 0 && type_is_alias(type) && !is_attr(type->attrs, ATTR_PUBLIC))
type = type_alias_get_aliasee(type);
- chat("encode_type: VT_USERDEFINED - type %p name = %s type->type %d idx %d\n", type,
- type->name, type->type, type->typelib_idx);
+ chat("encode_type: VT_USERDEFINED - type %p name = %s real type %d idx %d\n", type,
+ type->name, type_get_type(type), type->typelib_idx);
if(type->typelib_idx == -1) {
chat("encode_type: trying to ref not added type\n");
- switch(type->type) {
- case RPC_FC_STRUCT:
- case RPC_FC_PSTRUCT:
- case RPC_FC_CSTRUCT:
- case RPC_FC_CPSTRUCT:
- case RPC_FC_CVSTRUCT:
- case RPC_FC_BOGUS_STRUCT:
+ switch (type_get_type(type)) {
+ case TYPE_STRUCT:
add_structure_typeinfo(typelib, type);
break;
- case RPC_FC_IP:
+ case TYPE_INTERFACE:
add_interface_typeinfo(typelib, type);
break;
- case RPC_FC_ENUM16:
+ case TYPE_ENUM:
add_enum_typeinfo(typelib, type);
break;
- case RPC_FC_COCLASS:
+ case TYPE_COCLASS:
add_coclass_typeinfo(typelib, type);
break;
- case 0:
- 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);
+ error("encode_type: VT_USERDEFINED - unhandled type %d\n",
+ type_get_type(type));
}
}
@@ -1047,7 +1040,7 @@ static int encode_type(
static void dump_type(type_t *t)
{
- chat("dump_type: %p name %s type %d ref %p attrs %p\n", t, t->name, t->type, t->ref, t->attrs);
+ chat("dump_type: %p name %s type %d ref %p attrs %p\n", t, t->name, type_get_type(t), t->ref, t->attrs);
if(t->ref) dump_type(t->ref);
}
@@ -1482,7 +1475,7 @@ static HRESULT add_func_desc(msft_typeinfo_t* typeinfo, var_t *func, int index)
{
int vt;
expr_t *expr = (expr_t *)attr->u.pval;
- if (arg->type->type == RPC_FC_ENUM16)
+ if (type_get_type(arg->type) == TYPE_ENUM)
vt = VT_INT;
else
vt = get_type_vt(arg->type);
@@ -2211,42 +2204,25 @@ static void add_module_typeinfo(msft_typelib_t *typelib, type_t *module)
static void add_type_typeinfo(msft_typelib_t *typelib, type_t *type)
{
- switch (type->type) {
- case RPC_FC_IP:
+ switch (type_get_type(type)) {
+ case TYPE_INTERFACE:
add_interface_typeinfo(typelib, type);
break;
- case RPC_FC_STRUCT:
+ case TYPE_STRUCT:
add_structure_typeinfo(typelib, type);
break;
- case RPC_FC_ENUM16:
- case RPC_FC_ENUM32:
+ case TYPE_ENUM:
add_enum_typeinfo(typelib, type);
break;
- case RPC_FC_COCLASS:
+ case TYPE_COCLASS:
add_coclass_typeinfo(typelib, type);
break;
- case RPC_FC_BYTE:
- case RPC_FC_CHAR:
- case RPC_FC_USMALL:
- case RPC_FC_SMALL:
- case RPC_FC_WCHAR:
- case RPC_FC_USHORT:
- case RPC_FC_SHORT:
- case RPC_FC_ULONG:
- case RPC_FC_LONG:
- case RPC_FC_HYPER:
- case RPC_FC_IGNORE:
- case RPC_FC_FLOAT:
- case RPC_FC_DOUBLE:
- case RPC_FC_ERROR_STATUS_T:
- case RPC_FC_BIND_PRIMITIVE:
- case RPC_FC_RP:
- case RPC_FC_UP:
- case RPC_FC_OP:
- case RPC_FC_FP:
+ case TYPE_BASIC:
+ case TYPE_POINTER:
break;
default:
- error("add_entry: unhandled type 0x%x for %s\n", type->type, type->name);
+ error("add_entry: unhandled type 0x%x for %s\n",
+ type_get_type(type), type->name);
break;
}
}
More information about the wine-cvs
mailing list