Jacek Caban : widl:
Store typekind in msft_typeinfo_t to fix ATTR_DUAL handling.
Alexandre Julliard
julliard at wine.codeweavers.com
Fri Jul 28 07:15:12 CDT 2006
Module: wine
Branch: refs/heads/master
Commit: 4d76264f3e26272616b794fa6bc31028133afd70
URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=4d76264f3e26272616b794fa6bc31028133afd70
Author: Jacek Caban <jacek at codeweavers.com>
Date: Thu Jul 27 20:40:56 2006 +0200
widl: Store typekind in msft_typeinfo_t to fix ATTR_DUAL handling.
---
tools/widl/write_msft.c | 22 +++++++++++++---------
1 files changed, 13 insertions(+), 9 deletions(-)
diff --git a/tools/widl/write_msft.c b/tools/widl/write_msft.c
index 212d12d..2509c6c 100644
--- a/tools/widl/write_msft.c
+++ b/tools/widl/write_msft.c
@@ -101,6 +101,8 @@ typedef struct _msft_typeinfo_t
msft_typelib_t *typelib;
MSFT_TypeInfoBase *typeinfo;
+ int typekind;
+
unsigned int var_data_allocated;
int *var_data;
@@ -1260,7 +1262,7 @@ static HRESULT add_func_desc(msft_typein
id = ((0x6000 | (typeinfo->typeinfo->datatype2 & 0xffff)) << 16) | index;
- switch(typeinfo->typeinfo->typekind & 15) {
+ switch(typeinfo->typekind) {
case TKIND_DISPATCH:
funckind = 0x4; /* FUNC_DISPATCH */
break;
@@ -1346,8 +1348,8 @@ static HRESULT add_func_desc(msft_typein
switch(invokekind) {
case 0x2: /* INVOKE_PROPERTYGET */
- if((num_params != 0 && (typeinfo->typeinfo->typekind & 15) == TKIND_DISPATCH)
- || (num_params != 1 && (typeinfo->typeinfo->typekind & 15) == TKIND_INTERFACE)) {
+ if((num_params != 0 && typeinfo->typekind == TKIND_DISPATCH)
+ || (num_params != 1 && typeinfo->typekind == TKIND_INTERFACE)) {
error("expecting no args on a propget func\n");
return S_FALSE;
}
@@ -1528,12 +1530,12 @@ static HRESULT add_func_desc(msft_typein
namedata = typeinfo->typelib->typelib_segment_data[MSFT_SEG_NAME] + name_offset;
if (*((INT *)namedata) == -1) {
*((INT *)namedata) = typeinfo->typelib->typelib_typeinfo_offsets[typeinfo->typeinfo->typekind >> 16];
- if((typeinfo->typeinfo->typekind & 15) == TKIND_MODULE)
+ if(typeinfo->typekind == TKIND_MODULE)
namedata[9] |= 0x10;
} else
namedata[9] &= ~0x10;
- if((typeinfo->typeinfo->typekind & 15) == TKIND_MODULE)
+ if(typeinfo->typekind == TKIND_MODULE)
namedata[9] |= 0x20;
if(invokekind != 0x4 /* INVOKE_PROPERTYPUT */ && invokekind != 0x8 /* INVOKE_PROPERTYPUTREF */) {
@@ -1638,7 +1640,7 @@ static HRESULT add_var_desc(msft_typeinf
typeinfo->datawidth += var_alignment - 1;
typeinfo->datawidth &= ~(var_alignment - 1);
- switch(typeinfo->typeinfo->typekind & 0xf) {
+ switch(typeinfo->typekind) {
case TKIND_ENUM:
write_value(typeinfo->typelib, &typedata[4], VT_I4, &var->eval->cval);
var_kind = 2; /* VAR_CONST */
@@ -1655,7 +1657,7 @@ static HRESULT add_var_desc(msft_typeinf
var_alignment = 4;
break;
default:
- error("add_var_desc: unhandled type kind %d\n", typeinfo->typeinfo->typekind & 0xf);
+ error("add_var_desc: unhandled type kind %d\n", typeinfo->typekind);
break;
}
@@ -1692,12 +1694,12 @@ static HRESULT add_var_desc(msft_typeinf
namedata = typeinfo->typelib->typelib_segment_data[MSFT_SEG_NAME] + offset;
if (*((INT *)namedata) == -1) {
*((INT *)namedata) = typeinfo->typelib->typelib_typeinfo_offsets[typeinfo->typeinfo->typekind >> 16];
- if((typeinfo->typeinfo->typekind & 15) != TKIND_DISPATCH)
+ if(typeinfo->typekind != TKIND_DISPATCH)
namedata[9] |= 0x10;
} else
namedata[9] &= ~0x10;
- if ((typeinfo->typeinfo->typekind & 15) == TKIND_ENUM) {
+ if (typeinfo->typekind == TKIND_ENUM) {
namedata[9] |= 0x20;
}
typeinfo->var_names[var_num] = offset;
@@ -1745,6 +1747,7 @@ static msft_typeinfo_t *create_msft_type
typelib->typelib_segment_data[MSFT_SEG_NAME][nameoffset + 9] = 0x38;
*((int *)&typelib->typelib_segment_data[MSFT_SEG_NAME][nameoffset]) = typeinfo_offset;
+ msft_typeinfo->typekind = kind;
msft_typeinfo->typeinfo = typeinfo;
typeinfo->typekind |= kind | 0x20;
@@ -1781,6 +1784,7 @@ static msft_typeinfo_t *create_msft_type
case ATTR_DUAL:
/* FIXME: check interface is compatible */
+ typeinfo->typekind = (typeinfo->typekind & ~0xff) | 0x34;
typeinfo->flags |= 0x140; /* TYPEFLAG_FDUAL | TYPEFLAG_FOLEAUTOMATION */
break;
More information about the wine-cvs
mailing list