Module: wine Branch: master Commit: 3f13a07b47fedeec0190adfcacdf8c502c9ed461 URL: http://source.winehq.org/git/wine.git/?a=commit;h=3f13a07b47fedeec0190adfcac...
Author: Andrew Eikum aeikum@codeweavers.com Date: Fri Aug 20 14:58:53 2010 -0500
oleaut32: Implement ITypeInfo2::ReleaseFuncDesc.
---
dlls/oleaut32/typelib2.c | 36 +++++++++++++++++++++++++++++++++++- 1 files changed, 35 insertions(+), 1 deletions(-)
diff --git a/dlls/oleaut32/typelib2.c b/dlls/oleaut32/typelib2.c index d1b48ff..71fd434 100644 --- a/dlls/oleaut32/typelib2.c +++ b/dlls/oleaut32/typelib2.c @@ -3540,6 +3540,19 @@ static HRESULT WINAPI ITypeInfo2_fnGetContainingTypeLib( return S_OK; }
+static void release_typedesc(TYPEDESC *tdesc) +{ + while (tdesc) { + TYPEDESC *next; + if (tdesc->vt == VT_USERDEFINED) + next = NULL; + else + next = tdesc->u.lptdesc; + HeapFree(GetProcessHeap(), 0, tdesc); + tdesc = next; + } +} + /****************************************************************************** * ITypeInfo2_ReleaseTypeAttr {OLEAUT32} * @@ -3563,7 +3576,28 @@ static void WINAPI ITypeInfo2_fnReleaseFuncDesc( ITypeInfo2* iface, FUNCDESC* pFuncDesc) { - FIXME("(%p,%p), stub!\n", iface, pFuncDesc); + int i; + + TRACE("(%p,%p)\n", iface, pFuncDesc); + + HeapFree(GetProcessHeap(), 0, pFuncDesc->lprgscode); + + if (pFuncDesc->lprgelemdescParam) { + for (i = 0; i < pFuncDesc->cParams; ++i) { + if (pFuncDesc->lprgelemdescParam[i].tdesc.vt != VT_USERDEFINED) + release_typedesc(pFuncDesc->lprgelemdescParam[i].tdesc.u.lptdesc); + + HeapFree(GetProcessHeap(), 0, pFuncDesc->lprgelemdescParam[i].u.paramdesc.pparamdescex); + } + HeapFree(GetProcessHeap(), 0, pFuncDesc->lprgelemdescParam); + } + + HeapFree(GetProcessHeap(), 0, pFuncDesc->elemdescFunc.u.paramdesc.pparamdescex); + + if (pFuncDesc->elemdescFunc.tdesc.vt != VT_USERDEFINED) + release_typedesc(pFuncDesc->elemdescFunc.tdesc.u.lptdesc); + + HeapFree(GetProcessHeap(), 0, pFuncDesc); }
/******************************************************************************