Nikolay Sivov : oleaut32: Use function description layout instead of hardcoded byte offsets.

Alexandre Julliard julliard at winehq.org
Tue Dec 28 10:48:18 CST 2010


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

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Mon Dec 27 23:53:02 2010 +0300

oleaut32: Use function description layout instead of hardcoded byte offsets.

---

 dlls/oleaut32/typelib.c |   83 ++++++++++++++++++++--------------------------
 dlls/oleaut32/typelib.h |   24 ++++++-------
 2 files changed, 47 insertions(+), 60 deletions(-)

diff --git a/dlls/oleaut32/typelib.c b/dlls/oleaut32/typelib.c
index 72e1932..8482afe 100644
--- a/dlls/oleaut32/typelib.c
+++ b/dlls/oleaut32/typelib.c
@@ -1906,11 +1906,11 @@ MSFT_DoFuncs(TLBContext*     pcx,
      * in the first part of this file segment.
      */
 
-    int infolen, nameoffset, reclength, nrattributes, i;
+    int infolen, nameoffset, reclength, i;
     int recoffset = offset + sizeof(INT);
 
     char *recbuf = HeapAlloc(GetProcessHeap(), 0, 0xffff);
-    MSFT_FuncRecord * pFuncRec=(MSFT_FuncRecord *) recbuf;
+    MSFT_FuncRecord *pFuncRec = (MSFT_FuncRecord*)recbuf;
     TLBFuncDesc *ptfd_prev = NULL;
 
     TRACE_(typelib)("\n");
@@ -1919,6 +1919,8 @@ MSFT_DoFuncs(TLBContext*     pcx,
 
     for ( i = 0; i < cFuncs ; i++ )
     {
+        int optional;
+
         *pptfd = TLB_Alloc(sizeof(TLBFuncDesc));
 
         /* name, eventually add to a hash table */
@@ -1933,56 +1935,40 @@ MSFT_DoFuncs(TLBContext*     pcx,
             (*pptfd)->Name = MSFT_ReadName(pcx, nameoffset);
 
         /* read the function information record */
-        MSFT_ReadLEDWords(&reclength, sizeof(INT), pcx, recoffset);
+        MSFT_ReadLEDWords(&reclength, sizeof(pFuncRec->Info), pcx, recoffset);
 
         reclength &= 0xffff;
 
-        MSFT_ReadLEDWords(pFuncRec, reclength - sizeof(INT), pcx, DO_NOT_SEEK);
+        MSFT_ReadLEDWords(&pFuncRec->DataType, reclength - FIELD_OFFSET(MSFT_FuncRecord, DataType), pcx, DO_NOT_SEEK);
 
-        /* do the attributes */
-        nrattributes = (reclength - pFuncRec->nrargs * 3 * sizeof(int) - 0x18)
-                       / sizeof(int);
+        /* size without argument data */
+        optional = reclength - pFuncRec->nrargs*sizeof(MSFT_ParameterInfo);
 
-        if ( nrattributes > 0 )
-        {
-            (*pptfd)->helpcontext = pFuncRec->OptAttr[0] ;
+        if (optional > FIELD_OFFSET(MSFT_FuncRecord, HelpContext))
+            (*pptfd)->helpcontext = pFuncRec->HelpContext;
 
-            if ( nrattributes > 1 )
-            {
-                (*pptfd)->HelpString = MSFT_ReadString(pcx,
-                                                      pFuncRec->OptAttr[1]) ;
+        if (optional > FIELD_OFFSET(MSFT_FuncRecord, oHelpString))
+            (*pptfd)->HelpString = MSFT_ReadString(pcx, pFuncRec->oHelpString);
 
-                if ( nrattributes > 2 )
-                {
-                    if ( pFuncRec->FKCCIC & 0x2000 )
-                    {
-                       if (!IS_INTRESOURCE(pFuncRec->OptAttr[2]))
-                           ERR("ordinal 0x%08x invalid, IS_INTRESOURCE is false\n", pFuncRec->OptAttr[2]);
-                       (*pptfd)->Entry = (BSTR)(DWORD_PTR)LOWORD(pFuncRec->OptAttr[2]);
-                    }
-                    else
-                    {
-                        (*pptfd)->Entry = MSFT_ReadString(pcx,
-                                                         pFuncRec->OptAttr[2]);
-                    }
-                    if( nrattributes > 5 )
-                    {
-                        (*pptfd)->HelpStringContext = pFuncRec->OptAttr[5] ;
-
-                        if ( nrattributes > 6 && pFuncRec->FKCCIC & 0x80 )
-                        {
-                            MSFT_CustData(pcx,
-					  pFuncRec->OptAttr[6],
-					  &(*pptfd)->pCustData);
-                        }
-                    }
-                }
-                else
-                {
-                    (*pptfd)->Entry = (BSTR)-1;
-                }
+        if (optional > FIELD_OFFSET(MSFT_FuncRecord, oEntry))
+        {
+            if (pFuncRec->FKCCIC & 0x2000 )
+            {
+                if (!IS_INTRESOURCE(pFuncRec->oEntry))
+                    ERR("ordinal 0x%08x invalid, IS_INTRESOURCE is false\n", pFuncRec->oEntry);
+                (*pptfd)->Entry = (BSTR)(DWORD_PTR)LOWORD(pFuncRec->oEntry);
             }
+            else
+                (*pptfd)->Entry = MSFT_ReadString(pcx, pFuncRec->oEntry);
         }
+        else
+            (*pptfd)->Entry = (BSTR)-1;
+
+        if (optional > FIELD_OFFSET(MSFT_FuncRecord, HelpStringContext))
+            (*pptfd)->HelpStringContext = pFuncRec->HelpStringContext;
+
+        if (optional > FIELD_OFFSET(MSFT_FuncRecord, oCustData) && pFuncRec->FKCCIC & 0x80)
+            MSFT_CustData(pcx, pFuncRec->oCustData, &(*pptfd)->pCustData);
 
         /* fill the FuncDesc Structure */
         MSFT_ReadLEDWords( & (*pptfd)->funcdesc.memid, sizeof(INT), pcx,
@@ -2047,7 +2033,7 @@ MSFT_DoFuncs(TLBContext*     pcx,
                 {
                     INT* pInt = (INT *)((char *)pFuncRec +
                                    reclength -
-                                   (pFuncRec->nrargs * 4 + 1) * sizeof(INT) );
+                                   (pFuncRec->nrargs * 4) * sizeof(INT) );
 
                     PARAMDESC* pParamDesc = &elemdesc->u.paramdesc;
 
@@ -2059,11 +2045,14 @@ MSFT_DoFuncs(TLBContext*     pcx,
                 }
                 else
                     elemdesc->u.paramdesc.pparamdescex = NULL;
+
                 /* custom info */
-                if ( nrattributes > 7 + j && pFuncRec->FKCCIC & 0x80 )
+                if (optional > (FIELD_OFFSET(MSFT_FuncRecord, oArgCustData) +
+                                j*sizeof(pFuncRec->oArgCustData[0])) &&
+                    pFuncRec->FKCCIC & 0x80 )
                 {
                     MSFT_CustData(pcx,
-				  pFuncRec->OptAttr[7+j],
+				  pFuncRec->oArgCustData[j],
 				  &(*pptfd)->pParamDesc[j].pCustData);
                 }
 
@@ -2120,7 +2109,7 @@ static void MSFT_DoVars(TLBContext *pcx, ITypeInfoImpl *pTI, int cFuncs,
             (*pptvd)->HelpContext = pVarRec->HelpContext;
 
         if(reclength > FIELD_OFFSET(MSFT_VarRecord, oHelpString))
-            (*pptvd)->HelpString = MSFT_ReadString(pcx, pVarRec->oHelpString) ;
+            (*pptvd)->HelpString = MSFT_ReadString(pcx, pVarRec->oHelpString);
 
         if(reclength > FIELD_OFFSET(MSFT_VarRecord, HelpStringContext))
             (*pptvd)->HelpStringContext = pVarRec->HelpStringContext;
diff --git a/dlls/oleaut32/typelib.h b/dlls/oleaut32/typelib.h
index 210db33..6649407 100644
--- a/dlls/oleaut32/typelib.h
+++ b/dlls/oleaut32/typelib.h
@@ -177,7 +177,7 @@ typedef struct tagMSFT_ImpInfo {
 
 /* function description data */
 typedef struct {
-/*  INT   recsize;       record size including some xtra stuff */
+    INT   Info;         /* record size including some extra stuff */
     INT   DataType;     /* data type of the member, eg return of function */
     INT   Flags;        /* something to do with attribute flags (LOWORD) */
 #ifdef WORDS_BIGENDIAN
@@ -202,19 +202,17 @@ typedef struct {
     INT16 nrargs;       /* number of arguments (including optional ????) */
     INT16 nroargs;      /* nr of optional arguments */
 #endif
+
     /* optional attribute fields, the number of them is variable */
-    INT   OptAttr[1];
-/*
-0*  INT   helpcontext;
-1*  INT   oHelpString;
-2*  INT   oEntry;       // either offset in string table or numeric as it is //
-3*  INT   res9;         // unknown (-1) //
-4*  INT   resA;         // unknown (-1) //
-5*  INT   HelpStringContext;
-    // these are controlled by a bit set in the FKCCIC field  //
-6*  INT   oCustData;        // custom data for function //
-7*  INT   oArgCustData[1];  // custom data per argument //
-*/
+    INT   HelpContext;
+    INT   oHelpString;
+    INT   oEntry;       /* either offset in string table or numeric as it is */
+    INT   res9;         /* unknown (-1) */
+    INT   resA;         /* unknown (-1) */
+    INT   HelpStringContext;
+    /* these are controlled by a bit set in the FKCCIC field  */
+    INT   oCustData;        /* custom data for function */
+    INT   oArgCustData[1];  /* custom data per argument */
 } MSFT_FuncRecord;
 
 /* after this may follow an array with default value pointers if the




More information about the wine-cvs mailing list