Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/oleaut32/typelib.c | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-)
diff --git a/dlls/oleaut32/typelib.c b/dlls/oleaut32/typelib.c index 668ad8d582..f490795cc7 100644 --- a/dlls/oleaut32/typelib.c +++ b/dlls/oleaut32/typelib.c @@ -1724,15 +1724,16 @@ static inline TLBCustData *TLB_get_custdata_by_guid(struct list *custdata_list, return NULL; }
-static inline ITypeInfoImpl *TLB_get_typeinfo_by_name(ITypeInfoImpl **typeinfos, - UINT n, const OLECHAR *name) +static inline ITypeInfoImpl *TLB_get_typeinfo_by_name(ITypeLibImpl *typelib, const OLECHAR *name) { - while(n){ - if(!lstrcmpiW(TLB_get_bstr((*typeinfos)->Name), name)) - return *typeinfos; - ++typeinfos; - --n; + int i; + + for (i = 0; i < typelib->TypeInfoCount; ++i) + { + if (!lstrcmpiW(TLB_get_bstr(typelib->typeinfos[i]->Name), name)) + return typelib->typeinfos[i]; } + return NULL; }
@@ -5507,7 +5508,7 @@ static HRESULT WINAPI ITypeLibComp_fnBindType( if(!szName || !ppTInfo || !ppTComp) return E_INVALIDARG;
- info = TLB_get_typeinfo_by_name(This->typeinfos, This->TypeInfoCount, szName); + info = TLB_get_typeinfo_by_name(This, szName); if(!info){ *ppTInfo = NULL; *ppTComp = NULL; @@ -9007,7 +9008,7 @@ static HRESULT WINAPI ICreateTypeLib2_fnCreateTypeInfo(ICreateTypeLib2 *iface, if (!ctinfo || !name) return E_INVALIDARG;
- info = TLB_get_typeinfo_by_name(This->typeinfos, This->TypeInfoCount, name); + info = TLB_get_typeinfo_by_name(This, name); if (info) return TYPE_E_NAMECONFLICT;
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/oleaut32/typelib.c | 67 +++++++++++++++++++++-------------------- 1 file changed, 35 insertions(+), 32 deletions(-)
diff --git a/dlls/oleaut32/typelib.c b/dlls/oleaut32/typelib.c index f490795cc7..528fe6372c 100644 --- a/dlls/oleaut32/typelib.c +++ b/dlls/oleaut32/typelib.c @@ -1679,39 +1679,42 @@ static BSTR TLB_MultiByteToBSTR(const char *ptr) return ret; }
-static inline TLBFuncDesc *TLB_get_funcdesc_by_memberid(TLBFuncDesc *funcdescs, - UINT n, MEMBERID memid) +static inline TLBFuncDesc *TLB_get_funcdesc_by_memberid(ITypeInfoImpl *typeinfo, MEMBERID memid) { - while(n){ - if(funcdescs->funcdesc.memid == memid) - return funcdescs; - ++funcdescs; - --n; + int i; + + for (i = 0; i < typeinfo->typeattr.cFuncs; ++i) + { + if (typeinfo->funcdescs[i].funcdesc.memid == memid) + return &typeinfo->funcdescs[i]; } + return NULL; }
-static inline TLBVarDesc *TLB_get_vardesc_by_memberid(TLBVarDesc *vardescs, - UINT n, MEMBERID memid) +static inline TLBVarDesc *TLB_get_vardesc_by_memberid(ITypeInfoImpl *typeinfo, MEMBERID memid) { - while(n){ - if(vardescs->vardesc.memid == memid) - return vardescs; - ++vardescs; - --n; + int i; + + for (i = 0; i < typeinfo->typeattr.cVars; ++i) + { + if (typeinfo->vardescs[i].vardesc.memid == memid) + return &typeinfo->vardescs[i]; } + return NULL; }
-static inline TLBVarDesc *TLB_get_vardesc_by_name(TLBVarDesc *vardescs, - UINT n, const OLECHAR *name) +static inline TLBVarDesc *TLB_get_vardesc_by_name(ITypeInfoImpl *typeinfo, const OLECHAR *name) { - while(n){ - if(!lstrcmpiW(TLB_get_bstr(vardescs->Name), name)) - return vardescs; - ++vardescs; - --n; + int i; + + for (i = 0; i < typeinfo->typeattr.cVars; ++i) + { + if (!lstrcmpiW(TLB_get_bstr(typeinfo->vardescs[i].Name), name)) + return &typeinfo->vardescs[i]; } + return NULL; }
@@ -5128,7 +5131,7 @@ static HRESULT WINAPI ITypeLib2_fnFindName( } }
- var = TLB_get_vardesc_by_name(pTInfo->vardescs, pTInfo->typeattr.cVars, name); + var = TLB_get_vardesc_by_name(pTInfo, name); if (var) { memid[count] = var->vardesc.memid; goto ITypeLib2_fnFindName_exit; @@ -6117,7 +6120,7 @@ static HRESULT WINAPI ITypeInfo_fnGetNames( ITypeInfo2 *iface, MEMBERID memid,
*pcNames = 0;
- pFDesc = TLB_get_funcdesc_by_memberid(This->funcdescs, This->typeattr.cFuncs, memid); + pFDesc = TLB_get_funcdesc_by_memberid(This, memid); if(pFDesc) { if(!cMaxNames || !pFDesc->Name) @@ -6135,7 +6138,7 @@ static HRESULT WINAPI ITypeInfo_fnGetNames( ITypeInfo2 *iface, MEMBERID memid, return S_OK; }
- pVDesc = TLB_get_vardesc_by_memberid(This->vardescs, This->typeattr.cVars, memid); + pVDesc = TLB_get_vardesc_by_memberid(This, memid); if(pVDesc) { *rgBstrNames=SysAllocString(TLB_get_bstr(pVDesc->Name)); @@ -6294,7 +6297,7 @@ static HRESULT WINAPI ITypeInfo_fnGetIDsOfNames( ITypeInfo2 *iface, return ret; } } - pVDesc = TLB_get_vardesc_by_name(This->vardescs, This->typeattr.cVars, *rgszNames); + pVDesc = TLB_get_vardesc_by_name(This, *rgszNames); if(pVDesc){ if(cNames) *pMemId = pVDesc->vardesc.memid; @@ -7743,7 +7746,7 @@ static HRESULT WINAPI ITypeInfo_fnGetDocumentation( ITypeInfo2 *iface, *pBstrHelpFile=SysAllocString(TLB_get_bstr(This->pTypeLib->HelpFile)); return S_OK; }else {/* for a member */ - pFDesc = TLB_get_funcdesc_by_memberid(This->funcdescs, This->typeattr.cFuncs, memid); + pFDesc = TLB_get_funcdesc_by_memberid(This, memid); if(pFDesc){ if(pBstrName) *pBstrName = SysAllocString(TLB_get_bstr(pFDesc->Name)); @@ -7755,7 +7758,7 @@ static HRESULT WINAPI ITypeInfo_fnGetDocumentation( ITypeInfo2 *iface, *pBstrHelpFile = SysAllocString(TLB_get_bstr(This->pTypeLib->HelpFile)); return S_OK; } - pVDesc = TLB_get_vardesc_by_memberid(This->vardescs, This->typeattr.cVars, memid); + pVDesc = TLB_get_vardesc_by_memberid(This, memid); if(pVDesc){ if(pBstrName) *pBstrName = SysAllocString(TLB_get_bstr(pVDesc->Name)); @@ -7809,7 +7812,7 @@ static HRESULT WINAPI ITypeInfo_fnGetDllEntry( ITypeInfo2 *iface, MEMBERID memid if (This->typeattr.typekind != TKIND_MODULE) return TYPE_E_BADMODULEKIND;
- pFDesc = TLB_get_funcdesc_by_memberid(This->funcdescs, This->typeattr.cFuncs, memid); + pFDesc = TLB_get_funcdesc_by_memberid(This, memid); if(pFDesc){ dump_TypeInfo(This); if (TRACE_ON(ole)) @@ -8317,7 +8320,7 @@ static HRESULT WINAPI ITypeInfo2_fnGetVarIndexOfMemId( ITypeInfo2 * iface,
TRACE("%p %d %p\n", iface, memid, pVarIndex);
- pVarInfo = TLB_get_vardesc_by_memberid(This->vardescs, This->typeattr.cVars, memid); + pVarInfo = TLB_get_vardesc_by_memberid(This, memid); if(!pVarInfo) return TYPE_E_ELEMENTNOTFOUND;
@@ -8510,7 +8513,7 @@ static HRESULT WINAPI ITypeInfo2_fnGetDocumentation2( SysAllocString(TLB_get_bstr(This->pTypeLib->HelpStringDll));/* FIXME */ return S_OK; }else {/* for a member */ - pFDesc = TLB_get_funcdesc_by_memberid(This->funcdescs, This->typeattr.cFuncs, memid); + pFDesc = TLB_get_funcdesc_by_memberid(This, memid); if(pFDesc){ if(pbstrHelpString) *pbstrHelpString=SysAllocString(TLB_get_bstr(pFDesc->HelpString)); @@ -8521,7 +8524,7 @@ static HRESULT WINAPI ITypeInfo2_fnGetDocumentation2( SysAllocString(TLB_get_bstr(This->pTypeLib->HelpStringDll));/* FIXME */ return S_OK; } - pVDesc = TLB_get_vardesc_by_memberid(This->vardescs, This->typeattr.cVars, memid); + pVDesc = TLB_get_vardesc_by_memberid(This, memid); if(pVDesc){ if(pbstrHelpString) *pbstrHelpString=SysAllocString(TLB_get_bstr(pVDesc->HelpString)); @@ -8868,7 +8871,7 @@ static HRESULT WINAPI ITypeComp_fnBind( ITypeInfo_AddRef(*ppTInfo); return S_OK; } else { - pVDesc = TLB_get_vardesc_by_name(This->vardescs, This->typeattr.cVars, szName); + pVDesc = TLB_get_vardesc_by_name(This, szName); if(pVDesc){ HRESULT hr = TLB_AllocAndInitVarDesc(&pVDesc->vardesc, &pBindPtr->lpvardesc); if (FAILED(hr))
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/oleaut32/tests/typelib.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/dlls/oleaut32/tests/typelib.c b/dlls/oleaut32/tests/typelib.c index 053011d4be..0b2920dfe0 100644 --- a/dlls/oleaut32/tests/typelib.c +++ b/dlls/oleaut32/tests/typelib.c @@ -2813,7 +2813,7 @@ static void test_CreateTypeLib(SYSKIND sys) { hres = ITypeInfo_GetTypeAttr(dual, &typeattr); ok(hres == S_OK, "got %08x\n", hres); ok(typeattr->cbSizeInstance == ptr_size, "cbSizeInstance = %d\n", typeattr->cbSizeInstance); - ok(typeattr->typekind == 3, "typekind = %d\n", typeattr->typekind); + ok(typeattr->typekind == TKIND_INTERFACE, "typekind = %d\n", typeattr->typekind); ok(typeattr->cFuncs == 1, "cFuncs = %d\n", typeattr->cFuncs); ok(typeattr->cVars == 0, "cVars = %d\n", typeattr->cVars); ok(typeattr->cImplTypes == 1, "cImplTypes = %d\n", typeattr->cImplTypes); @@ -2835,7 +2835,7 @@ static void test_CreateTypeLib(SYSKIND sys) { hres = ITypeInfo_GetTypeAttr(ti, &typeattr); ok(hres == S_OK, "got %08x\n", hres); ok(typeattr->cbSizeInstance == ptr_size, "cbSizeInstance = %d\n", typeattr->cbSizeInstance); - ok(typeattr->typekind == 4, "typekind = %d\n", typeattr->typekind); + ok(typeattr->typekind == TKIND_DISPATCH, "typekind = %d\n", typeattr->typekind); ok(typeattr->cFuncs == 8, "cFuncs = %d\n", typeattr->cFuncs); ok(typeattr->cVars == 0, "cVars = %d\n", typeattr->cVars); ok(typeattr->cImplTypes == 1, "cImplTypes = %d\n", typeattr->cImplTypes); @@ -2857,7 +2857,7 @@ static void test_CreateTypeLib(SYSKIND sys) { hres = ITypeInfo_GetTypeAttr(interface1, &typeattr); ok(hres == S_OK, "got %08x\n", hres); ok(typeattr->cbSizeInstance == ptr_size, "cbSizeInstance = %d\n", typeattr->cbSizeInstance); - ok(typeattr->typekind == 3, "typekind = %d\n", typeattr->typekind); + ok(typeattr->typekind == TKIND_INTERFACE, "typekind = %d\n", typeattr->typekind); ok(typeattr->cFuncs == 13, "cFuncs = %d\n", typeattr->cFuncs); ok(typeattr->cVars == 0, "cVars = %d\n", typeattr->cVars); ok(typeattr->cImplTypes == 1, "cImplTypes = %d\n", typeattr->cImplTypes); @@ -2872,7 +2872,7 @@ static void test_CreateTypeLib(SYSKIND sys) { hres = ITypeInfo_GetTypeAttr(interface2, &typeattr); ok(hres == S_OK, "got %08x\n", hres); ok(typeattr->cbSizeInstance == ptr_size, "cbSizeInstance = %d\n", typeattr->cbSizeInstance); - ok(typeattr->typekind == 3, "typekind = %d\n", typeattr->typekind); + ok(typeattr->typekind == TKIND_INTERFACE, "typekind = %d\n", typeattr->typekind); ok(typeattr->cFuncs == 2, "cFuncs = %d\n", typeattr->cFuncs); ok(typeattr->cVars == 0, "cVars = %d\n", typeattr->cVars); ok(typeattr->cImplTypes == 1, "cImplTypes = %d\n", typeattr->cImplTypes);
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/oleaut32/tests/typelib.c | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-)
diff --git a/dlls/oleaut32/tests/typelib.c b/dlls/oleaut32/tests/typelib.c index 0b2920dfe0..4ffbaa9e2d 100644 --- a/dlls/oleaut32/tests/typelib.c +++ b/dlls/oleaut32/tests/typelib.c @@ -76,6 +76,15 @@ #define ARCH "none" #endif
+#define EXPECT_REF(obj,ref) _expect_ref((IUnknown*)obj, ref, __LINE__) +static void _expect_ref(IUnknown* obj, ULONG ref, int line) +{ + ULONG rc; + IUnknown_AddRef(obj); + rc = IUnknown_Release(obj); + ok_(__FILE__,line)(rc == ref, "expected refcount %d, got %d\n", ref, rc); +} + static HRESULT (WINAPI *pRegisterTypeLibForUser)(ITypeLib*,OLECHAR*,OLECHAR*); static HRESULT (WINAPI *pUnRegisterTypeLibForUser)(REFGUID,WORD,WORD,LCID,SYSKIND);
@@ -1846,6 +1855,7 @@ static void test_CreateTypeLib(SYSKIND sys) { static const GUID interfaceguid = {0x3b9ff02f,0x9675,0x4861,{0xb7,0x81,0xce,0xae,0xa4,0x78,0x2a,0xcc}}; static const GUID interface2guid = {0x3b9ff02f,0x9675,0x4861,{0xb7,0x81,0xce,0xae,0xa4,0x78,0x2a,0xcd}};
+ ITypeInfo *interface1, *interface2, *dual, *unknown, *dispatch, *ti, *ti_2; char filename[MAX_PATH]; WCHAR filenameW[MAX_PATH]; ICreateTypeLib2 *createtl; @@ -1853,7 +1863,6 @@ static void test_CreateTypeLib(SYSKIND sys) { ICreateTypeInfo2 *createti2; ITypeLib *tl, *stdole; ITypeLib2 *tl2; - ITypeInfo *interface1, *interface2, *dual, *unknown, *dispatch, *ti; ITypeInfo *tinfos[2]; ITypeInfo2 *ti2; ITypeComp *tcomp, *tcomp2; @@ -2829,8 +2838,11 @@ static void test_CreateTypeLib(SYSKIND sys) { ok(hres == S_OK, "got %08x\n", hres); ok(hreftype == -2, "got %08x\n", hreftype);
+ EXPECT_REF(dual, 2); hres = ITypeInfo_GetRefTypeInfo(dual, -2, &ti); ok(hres == S_OK, "got %08x\n", hres); +todo_wine + EXPECT_REF(dual, 3);
hres = ITypeInfo_GetTypeAttr(ti, &typeattr); ok(hres == S_OK, "got %08x\n", hres); @@ -2847,6 +2859,18 @@ static void test_CreateTypeLib(SYSKIND sys) {
ITypeInfo_ReleaseTypeAttr(ti, typeattr);
+ hres = ITypeInfo_GetRefTypeInfo(dual, -2, &ti_2); + ok(hres == S_OK, "Failed to get reference typeinfo, hr %#x.\n", hres); +todo_wine { + ok(ti == ti_2, "Unexpected typeinfo instance.\n"); + EXPECT_REF(dual, 4); +} + ITypeInfo_AddRef(ti_2); +todo_wine + EXPECT_REF(dual, 5); + ITypeInfo_Release(ti_2); + + ITypeInfo_Release(ti_2); ITypeInfo_Release(ti);
hres = ICreateTypeInfo_SetTypeDescAlias(createti, &typedesc1);