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