Module: wine Branch: refs/heads/master Commit: 4d76264f3e26272616b794fa6bc31028133afd70 URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=4d76264f3e26272616b794fa...
Author: Jacek Caban jacek@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;