From f76334fd3e0c13d8ff66a6814ba4ceb9a1313067 Mon Sep 17 00:00:00 2001 From: Andrew Eikum Date: Thu, 10 Mar 2011 15:21:52 -0600 Subject: [PATCH] oleaut32: Convert TLBImplType to be stored as an array. --- dlls/oleaut32/typelib.c | 203 +++++++++++++++++++--------------------- 1 file changed, 98 insertions(+), 105 deletions(-) diff --git a/dlls/oleaut32/typelib.c b/dlls/oleaut32/typelib.c index 37c2d0a6018..dc9895be758 100644 --- a/dlls/oleaut32/typelib.c +++ b/dlls/oleaut32/typelib.c @@ -1095,7 +1095,6 @@ typedef struct tagTLBImplType int implflags; /* IMPLFLAG_*s */ int ctCustData; TLBCustData * pCustData;/* linked list to custom data; */ - struct tagTLBImplType *next; } TLBImplType; /* internal TypeInfo data */ @@ -1125,7 +1124,7 @@ typedef struct tagITypeInfoImpl TLBVarDesc * varlist; /* linked list with variable descriptions */ /* Implemented Interfaces */ - TLBImplType * impltypelist; + TLBImplType *impltypes; int ctCustData; TLBCustData * pCustData; /* linked list to cust data; */ @@ -1334,13 +1333,15 @@ static void dump_TLBRefType(const ITypeLibImpl *pTL) } } -static void dump_TLBImplType(const TLBImplType * impl) +static void dump_TLBImplType(const TLBImplType * impl, UINT n) { - while (impl) { - TRACE_(typelib)( - "implementing/inheriting interface hRef = %x implflags %x\n", - impl->hRef, impl->implflags); - impl = impl->next; + if(!impl) + return; + while (n) { + TRACE_(typelib)("implementing/inheriting interface hRef = %x implflags %x\n", + impl->hRef, impl->implflags); + ++impl; + --n; } } @@ -1434,7 +1435,7 @@ static void dump_TypeInfo(const ITypeInfoImpl * pty) if (TRACE_ON(ole)) dump_TLBFuncDesc(pty->funcdescs, pty->TypeAttr.cFuncs); dump_TLBVarDesc(pty->varlist); - dump_TLBImplType(pty->impltypelist); + dump_TLBImplType(pty->impltypes, pty->TypeAttr.cImplTypes); } static void dump_VARDESC(const VARDESC *v) @@ -2224,21 +2225,22 @@ static void MSFT_DoImplTypes(TLBContext *pcx, ITypeInfoImpl *pTI, int count, { int i; MSFT_RefRecord refrec; - TLBImplType **ppImpl = &pTI->impltypelist; + TLBImplType *pImpl; TRACE_(typelib)("\n"); + pTI->impltypes = heap_alloc_zero(count * sizeof(TLBImplType)); + pImpl = pTI->impltypes; for(i=0;ipTblDir->pRefTab.offset); MSFT_DoRefType(pcx, pTI->pTypeLib, refrec.reftype); - (*ppImpl)->hRef = refrec.reftype; - (*ppImpl)->implflags=refrec.flags; - (*ppImpl)->ctCustData= - MSFT_CustData(pcx, refrec.oCustData, &(*ppImpl)->pCustData); + pImpl->hRef = refrec.reftype; + pImpl->implflags=refrec.flags; + pImpl->ctCustData= + MSFT_CustData(pcx, refrec.oCustData, &pImpl->pCustData); offset=refrec.onext; - ppImpl=&((*ppImpl)->next); + ++pImpl; } } /* @@ -2324,15 +2326,15 @@ static ITypeInfoImpl * MSFT_DoTypeInfo( if (tiBase.datatype1 != -1) { - ptiRet->impltypelist = heap_alloc_zero(sizeof(TLBImplType)); - ptiRet->impltypelist->hRef = tiBase.datatype1; + ptiRet->impltypes = heap_alloc_zero(sizeof(TLBImplType)); + ptiRet->impltypes[0].hRef = tiBase.datatype1; MSFT_DoRefType(pcx, pLibInfo, tiBase.datatype1); } - break; + break; default: - ptiRet->impltypelist = heap_alloc_zero(sizeof(TLBImplType)); + ptiRet->impltypes = heap_alloc_zero(sizeof(TLBImplType)); MSFT_DoRefType(pcx, pLibInfo, tiBase.datatype1); - ptiRet->impltypelist->hRef = tiBase.datatype1; + ptiRet->impltypes[0].hRef = tiBase.datatype1; break; } } @@ -3401,7 +3403,7 @@ static char *SLTG_DoImpls(char *pBlk, ITypeInfoImpl *pTI, BOOL OneOnly, const sltg_ref_lookup_t *ref_lookup) { SLTG_ImplInfo *info; - TLBImplType **ppImplType = &pTI->impltypelist; + TLBImplType *pImplType; /* I don't really get this structure, usually it's 0x16 bytes long, but iuser.tlb contains some that are 0x18 bytes long. That's ok because we can use the next ptr to jump to the next @@ -3410,14 +3412,22 @@ static char *SLTG_DoImpls(char *pBlk, ITypeInfoImpl *pTI, the last one is the regular 0x16 bytes. */ info = (SLTG_ImplInfo*)pBlk; - while(1) { - *ppImplType = heap_alloc_zero(sizeof(**ppImplType)); - sltg_get_typelib_ref(ref_lookup, info->ref, &(*ppImplType)->hRef); - (*ppImplType)->implflags = info->impltypeflags; - pTI->TypeAttr.cImplTypes++; - ppImplType = &(*ppImplType)->next; - + while(1){ + pTI->TypeAttr.cImplTypes++; if(info->next == 0xffff) + break; + info = (SLTG_ImplInfo*)(pBlk + info->next); + } + + info = (SLTG_ImplInfo*)pBlk; + pTI->impltypes = heap_alloc_zero(pTI->TypeAttr.cImplTypes * sizeof(TLBImplType)); + pImplType = pTI->impltypes; + while(1) { + sltg_get_typelib_ref(ref_lookup, info->ref, &pImplType->hRef); + pImplType->implflags = info->impltypeflags; + ++pImplType; + + if(info->next == 0xffff) break; if(OneOnly) FIXME_(typelib)("Interface inheriting more than one interface\n"); @@ -4982,8 +4992,7 @@ static ULONG WINAPI ITypeInfo_fnAddRef( ITypeInfo2 *iface) static void ITypeInfoImpl_Destroy(ITypeInfoImpl *This) { TLBVarDesc *pVInfo, *pVInfoNext; - TLBImplType *pImpl, *pImplNext; - UINT fdc; + UINT fdc, itc; TRACE("destroying ITypeInfo(%p)\n",This); @@ -5034,12 +5043,15 @@ static void ITypeInfoImpl_Destroy(ITypeInfoImpl *This) pVInfoNext = pVInfo->next; heap_free(pVInfo); } - for (pImpl = This->impltypelist; pImpl; pImpl = pImplNext) - { - TLB_FreeCustData(pImpl->pCustData); - pImplNext = pImpl->next; - heap_free(pImpl); + + if(This->impltypes){ + for (itc = 0; itc < This->TypeAttr.cImplTypes; ++itc){ + TLBImplType *pImpl = &This->impltypes[itc]; + TLB_FreeCustData(pImpl->pCustData); + } + heap_free(This->impltypes); } + TLB_FreeCustData(This->pCustData); heap_free(This); @@ -5269,12 +5281,12 @@ static HRESULT ITypeInfoImpl_GetInternalDispatchFuncDesc( ITypeInfo *iface, else *hrefoffset = DISPATCH_HREF_OFFSET; - if(This->impltypelist) + if(This->impltypes) { ITypeInfo *pSubTypeInfo; UINT sub_funcs; - hr = ITypeInfo_GetRefTypeInfo(iface, This->impltypelist->hRef, &pSubTypeInfo); + hr = ITypeInfo_GetRefTypeInfo(iface, This->impltypes[0].hRef, &pSubTypeInfo); if (FAILED(hr)) return hr; @@ -5485,12 +5497,12 @@ static HRESULT WINAPI ITypeInfo_fnGetNames( ITypeInfo2 *iface, MEMBERID memid, } else { - if(This->impltypelist && + if(This->impltypes && (This->TypeAttr.typekind==TKIND_INTERFACE || This->TypeAttr.typekind==TKIND_DISPATCH)) { /* recursive search */ ITypeInfo *pTInfo; HRESULT result; - result=ITypeInfo_GetRefTypeInfo(iface, This->impltypelist->hRef, + result=ITypeInfo_GetRefTypeInfo(iface, This->impltypes[0].hRef, &pTInfo); if(SUCCEEDED(result)) { @@ -5526,9 +5538,7 @@ static HRESULT WINAPI ITypeInfo_fnGetRefTypeOfImplType( HREFTYPE *pRefType) { ITypeInfoImpl *This = (ITypeInfoImpl *)iface; - UINT i; HRESULT hr = S_OK; - const TLBImplType *pImpl = This->impltypelist; TRACE("(%p) index %d\n", This, index); if (TRACE_ON(ole)) dump_TypeInfo(This); @@ -5556,16 +5566,10 @@ static HRESULT WINAPI ITypeInfo_fnGetRefTypeOfImplType( } else { - /* get element n from linked list */ - for(i=0; pImpl && inext; - } - - if (pImpl) - *pRefType = pImpl->hRef; - else - hr = TYPE_E_ELEMENTNOTFOUND; + if(index >= This->TypeAttr.cImplTypes) + hr = TYPE_E_ELEMENTNOTFOUND; + else + *pRefType = This->impltypes[index].hRef; } if(TRACE_ON(ole)) @@ -5588,24 +5592,20 @@ static HRESULT WINAPI ITypeInfo_fnGetImplTypeFlags( ITypeInfo2 *iface, UINT index, INT *pImplTypeFlags) { ITypeInfoImpl *This = (ITypeInfoImpl *)iface; - UINT i; - TLBImplType *pImpl; TRACE("(%p) index %d\n", This, index); - for(i=0, pImpl=This->impltypelist; inext) - ; - if(i==index && pImpl){ - *pImplTypeFlags=pImpl->implflags; + + if(This->TypeAttr.typekind == TKIND_DISPATCH && index == 0){ + *pImplTypeFlags = 0; return S_OK; } - *pImplTypeFlags=0; - if(This->TypeAttr.typekind==TKIND_DISPATCH && !index) - return S_OK; + if(index >= This->TypeAttr.cImplTypes) + return TYPE_E_ELEMENTNOTFOUND; - WARN("ImplType %d not found\n", index); - return TYPE_E_ELEMENTNOTFOUND; + *pImplTypeFlags = This->impltypes[index].implflags; + + return S_OK; } /* GetIDsOfNames @@ -5652,11 +5652,11 @@ static HRESULT WINAPI ITypeInfo_fnGetIDsOfNames( ITypeInfo2 *iface, } } /* not found, see if it can be found in an inherited interface */ - if(This->impltypelist) { + if(This->impltypes) { /* recursive search */ ITypeInfo *pTInfo; ret=ITypeInfo_GetRefTypeInfo(iface, - This->impltypelist->hRef, &pTInfo); + This->impltypes[0].hRef, &pTInfo); if(SUCCEEDED(ret)){ ret=ITypeInfo_GetIDsOfNames(pTInfo, rgszNames, cNames, pMemId ); ITypeInfo_Release(pTInfo); @@ -6639,10 +6639,10 @@ func_fail: /* not found, look for it in inherited interfaces */ ITypeInfo2_GetTypeKind(iface, &type_kind); if(type_kind == TKIND_INTERFACE || type_kind == TKIND_DISPATCH) { - if(This->impltypelist) { + if(This->impltypes) { /* recursive search */ ITypeInfo *pTInfo; - hres = ITypeInfo_GetRefTypeInfo(iface, This->impltypelist->hRef, &pTInfo); + hres = ITypeInfo_GetRefTypeInfo(iface, This->impltypes[0].hRef, &pTInfo); if(SUCCEEDED(hres)){ hres = ITypeInfo_Invoke(pTInfo,pIUnk,memid,wFlags,pDispParams,pVarResult,pExcepInfo,pArgErr); ITypeInfo_Release(pTInfo); @@ -6705,12 +6705,12 @@ static HRESULT WINAPI ITypeInfo_fnGetDocumentation( ITypeInfo2 *iface, } } - if(This->impltypelist && + if(This->impltypes && (This->TypeAttr.typekind==TKIND_INTERFACE || This->TypeAttr.typekind==TKIND_DISPATCH)) { /* recursive search */ ITypeInfo *pTInfo; HRESULT result; - result = ITypeInfo_GetRefTypeInfo(iface, This->impltypelist->hRef, + result = ITypeInfo_GetRefTypeInfo(iface, This->impltypes[0].hRef, &pTInfo); if(SUCCEEDED(result)) { result = ITypeInfo_GetDocumentation(pTInfo, memid, pBstrName, @@ -6781,11 +6781,11 @@ static HRESULT ITypeInfoImpl_GetDispatchRefTypeInfo( ITypeInfo *iface, TRACE("%p, 0x%x\n", iface, *hRefType); - if (This->impltypelist && (*hRefType & DISPATCH_HREF_MASK)) + if (This->impltypes && (*hRefType & DISPATCH_HREF_MASK)) { ITypeInfo *pSubTypeInfo; - hr = ITypeInfo_GetRefTypeInfo(iface, This->impltypelist->hRef, &pSubTypeInfo); + hr = ITypeInfo_GetRefTypeInfo(iface, This->impltypes[0].hRef, &pSubTypeInfo); if (FAILED(hr)) return hr; @@ -7345,17 +7345,14 @@ static HRESULT WINAPI ITypeInfo2_fnGetImplTypeCustData( { ITypeInfoImpl *This = (ITypeInfoImpl *)iface; TLBCustData *pCData=NULL; - TLBImplType * pRDesc; - UINT i; + TLBImplType *pRDesc = &This->impltypes[index]; - for(i=0, pRDesc=This->impltypelist; i!=index && pRDesc; i++, pRDesc=pRDesc->next); + if(index >= This->TypeAttr.cImplTypes) + return TYPE_E_ELEMENTNOTFOUND; - if(pRDesc) + for(pCData = pRDesc->pCustData; pCData; pCData = pCData->next) { - for(pCData=pRDesc->pCustData; pCData; pCData = pCData->next) - { if( IsEqualIID(guid, &pCData->guid)) break; - } } TRACE("(%p) guid %s %s found!x)\n", This, debugstr_guid(guid), pCData? "" : "NOT"); @@ -7366,7 +7363,8 @@ static HRESULT WINAPI ITypeInfo2_fnGetImplTypeCustData( VariantCopy( pVarVal, &pCData->data); return S_OK; } - return E_INVALIDARG; /* FIXME: correct? */ + + return TYPE_E_ELEMENTNOTFOUND; } /* ITypeInfo2::GetDocumentation2 @@ -7582,30 +7580,25 @@ static HRESULT WINAPI ITypeInfo2_fnGetAllImplTypeCustData( { ITypeInfoImpl *This = (ITypeInfoImpl *)iface; TLBCustData *pCData; - TLBImplType * pRDesc; + TLBImplType *pRDesc = &This->impltypes[index]; UINT i; + TRACE("(%p) index %d\n", This, index); - for(i=0, pRDesc=This->impltypelist; i!=index && pRDesc; i++, - pRDesc=pRDesc->next) - ; - if(pRDesc){ - pCustData->prgCustData = - heap_alloc_zero(pRDesc->ctCustData * sizeof(CUSTDATAITEM)); - if(pCustData->prgCustData ){ - pCustData->cCustData=pRDesc->ctCustData; - for(i=0, pCData=pRDesc->pCustData; pCData; i++, - pCData = pCData->next){ - pCustData->prgCustData[i].guid=pCData->guid; - VariantCopy(& pCustData->prgCustData[i].varValue, - & pCData->data); - } - }else{ - ERR(" OUT OF MEMORY!\n"); - return E_OUTOFMEMORY; - } - return S_OK; + + if(index >= This->TypeAttr.cImplTypes) + return TYPE_E_ELEMENTNOTFOUND; + + pCustData->prgCustData = heap_alloc_zero(pRDesc->ctCustData * sizeof(CUSTDATAITEM)); + if(!pCustData->prgCustData) + return E_OUTOFMEMORY; + + pCustData->cCustData=pRDesc->ctCustData; + for(i = 0, pCData = pRDesc->pCustData; pCData; i++, pCData = pCData->next){ + pCustData->prgCustData[i].guid = pCData->guid; + VariantCopy(&pCustData->prgCustData[i].varValue, &pCData->data); } - return TYPE_E_ELEMENTNOTFOUND; + + return S_OK; } static const ITypeInfo2Vtbl tinfvt = @@ -7758,8 +7751,8 @@ HRESULT WINAPI CreateDispTypeInfo( pTIClass->TypeAttr.cVars = 0; pTIClass->TypeAttr.wTypeFlags = 0; - pTIClass->impltypelist = heap_alloc_zero(sizeof(*pTIClass->impltypelist)); - pTIClass->impltypelist->hRef = 0; + pTIClass->impltypes = heap_alloc_zero(sizeof(*pTIClass->impltypes)); + pTIClass->impltypes[0].hRef = 0; ref = heap_alloc_zero(sizeof(*ref)); ref->index = 0; @@ -7857,12 +7850,12 @@ static HRESULT WINAPI ITypeComp_fnBind( } } /* FIXME: search each inherited interface, not just the first */ - if (hr == DISP_E_MEMBERNOTFOUND && This->impltypelist) { + if (hr == DISP_E_MEMBERNOTFOUND && This->impltypes) { /* recursive search */ ITypeInfo *pTInfo; ITypeComp *pTComp; HRESULT hr; - hr=ITypeInfo_GetRefTypeInfo((ITypeInfo *)&This->lpVtbl, This->impltypelist->hRef, &pTInfo); + hr=ITypeInfo_GetRefTypeInfo((ITypeInfo *)&This->lpVtbl, This->impltypes[0].hRef, &pTInfo); if (SUCCEEDED(hr)) { hr = ITypeInfo_GetTypeComp(pTInfo,&pTComp);