Nikolay Sivov : oleaut32: Add a helper to return INVOKEKIND flags value.

Alexandre Julliard julliard at winehq.org
Mon Dec 27 10:03:53 CST 2010


Module: wine
Branch: master
Commit: b6313c702e6c7b43d58a47c9f2f2bcf7d6d9e57d
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=b6313c702e6c7b43d58a47c9f2f2bcf7d6d9e57d

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Sat Dec 25 04:25:09 2010 +0300

oleaut32: Add a helper to return INVOKEKIND flags value.

---

 dlls/oleaut32/typelib2.c |   20 ++++++++++++++------
 1 files changed, 14 insertions(+), 6 deletions(-)

diff --git a/dlls/oleaut32/typelib2.c b/dlls/oleaut32/typelib2.c
index 9b3015b..78192b1 100644
--- a/dlls/oleaut32/typelib2.c
+++ b/dlls/oleaut32/typelib2.c
@@ -240,6 +240,13 @@ static inline UINT cti2_get_func_count(const MSFT_TypeInfoBase *typeinfo)
     return typeinfo->cElement & 0xFFFF;
 }
 
+/* NOTE: entry always assumed to be a function */
+static inline INVOKEKIND ctl2_get_invokekind(const CyclicList *func)
+{
+    /* INVOKEKIND uses bit flags up to 8 */
+    return (func->u.data[4] >> 3) & 0xF;
+}
+
 /****************************************************************************
  *	ctl2_init_header
  *
@@ -2348,17 +2355,19 @@ static HRESULT WINAPI ICreateTypeInfo2_fnSetFuncAndParamNames(
                 break;
 
     /* cNames == cParams for put or putref accessor, cParams+1 otherwise */
-    if(cNames != iter->u.data[5] + ((iter->u.data[4]>>3)&(INVOKE_PROPERTYPUT|INVOKE_PROPERTYPUTREF) ? 0 : 1))
+    if(cNames != iter->u.data[5] + (ctl2_get_invokekind(iter) & (INVOKE_PROPERTYPUT|INVOKE_PROPERTYPUTREF) ? 0 : 1))
         return TYPE_E_ELEMENTNOTFOUND;
 
+    TRACE("function name %s\n", debugstr_w(names[0]));
     len = ctl2_encode_name(This->typelib, names[0], &namedata);
     for(iter2=This->typedata->next->next; iter2!=This->typedata->next; iter2=iter2->next) {
         if(iter2->name!=-1 && !memcmp(namedata,
                     This->typelib->typelib_segment_data[MSFT_SEG_NAME]+iter2->name+8, len)) {
             /* getters/setters can have a same name */
             if (iter2->type == CyclicListFunc) {
-                INT inv1 = iter2->u.data[4] >> 3;
-                INT inv2 = iter->u.data[4] >> 3;
+                INVOKEKIND inv1 = ctl2_get_invokekind(iter2);
+                INVOKEKIND inv2 = ctl2_get_invokekind(iter);
+
                 if (((inv1&(INVOKE_PROPERTYPUT|INVOKE_PROPERTYPUTREF)) && (inv2&INVOKE_PROPERTYGET)) ||
                     ((inv2&(INVOKE_PROPERTYPUT|INVOKE_PROPERTYPUTREF)) && (inv1&INVOKE_PROPERTYGET)))
                     continue;
@@ -2801,13 +2810,12 @@ static HRESULT WINAPI ICreateTypeInfo2_fnLayOut(
 
     for(i=0; i< cti2_get_func_count(This->typeinfo); i++) {
         if(typedata[i]->u.data[4]>>16 > i) {
-            int inv;
+            INVOKEKIND inv = ctl2_get_invokekind(typedata[i]);
 
-            inv = (typedata[i]->u.data[4]>>3) & 0xf;
             i = typedata[i]->u.data[4] >> 16;
 
             while(i > typedata[i]->u.data[4]>>16) {
-                int invkind = (typedata[i]->u.data[4]>>3) & 0xf;
+                INVOKEKIND invkind = ctl2_get_invokekind(typedata[i]);
 
                 if(inv & invkind) {
                     HeapFree(GetProcessHeap(), 0, typedata);




More information about the wine-cvs mailing list