Module: wine Branch: refs/heads/master Commit: 0f8db3fecac4ef1b8d30d571832d7b80aa319fc6 URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=0f8db3fecac4ef1b8d30d571...
Author: Robert Shearman rob@codeweavers.com Date: Mon Jan 16 20:43:20 2006 +0100
oleaut: Simplify missing argument handling in ITypeInfo::Invoke. Simplify missing argument handling by pre-allocating an array of the maximum number of missing arguments there could be.
---
dlls/oleaut32/typelib.c | 16 ++++------------ 1 files changed, 4 insertions(+), 12 deletions(-)
diff --git a/dlls/oleaut32/typelib.c b/dlls/oleaut32/typelib.c index 983eda3..14aa8cd 100644 --- a/dlls/oleaut32/typelib.c +++ b/dlls/oleaut32/typelib.c @@ -5207,30 +5207,22 @@ static HRESULT WINAPI ITypeInfo_fnInvoke switch (func_desc->funckind) { case FUNC_PUREVIRTUAL: case FUNC_VIRTUAL: { - VARIANTARG *rgvarg = NULL; + VARIANTARG *rgvarg = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*rgvarg) * func_desc->cParams); VARIANTARG **prgpvarg = HeapAlloc(GetProcessHeap(), 0, sizeof(*prgpvarg) * func_desc->cParams); VARTYPE *rgvt = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*rgvt) * func_desc->cParams); + VARIANTARG *missing_arg = HeapAlloc(GetProcessHeap(), 0, sizeof(*missing_arg) * func_desc->cParams); VARIANT varresult; - SHORT missing_param_offset = func_desc->cParams; - SHORT missing_params = 0; VARIANT retval; /* pointer for storing byref retvals in */
hres = S_OK; for (i = 0; i < func_desc->cParams; i++) { TYPEDESC *tdesc = &func_desc->lprgelemdescParam[i].tdesc; - USHORT wParamFlags = func_desc->lprgelemdescParam[i].u.paramdesc.wParamFlags; hres = typedescvt_to_variantvt((ITypeInfo *)iface, tdesc, &rgvt[i]); if (FAILED(hres)) goto func_fail; - if ((i >= pDispParams->cArgs) && - (wParamFlags & PARAMFLAG_FOPT) && - !(wParamFlags & PARAMFLAG_FHASDEFAULT)) - missing_params++; }
- rgvarg = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*rgvarg) * (func_desc->cParams + missing_params)); - TRACE("changing args\n"); for (i = 0; i < func_desc->cParams; i++) { @@ -5284,8 +5276,7 @@ static HRESULT WINAPI ITypeInfo_fnInvoke else { V_VT(arg) = VT_VARIANT | VT_BYREF; - V_VARIANTREF(arg) = &rgvarg[missing_param_offset]; - missing_param_offset++; + V_VARIANTREF(arg) = &missing_arg[i]; V_VT(V_VARIANTREF(arg)) = VT_ERROR; V_ERROR(V_VARIANTREF(arg)) = DISP_E_PARAMNOTFOUND; } @@ -5371,6 +5362,7 @@ static HRESULT WINAPI ITypeInfo_fnInvoke }
func_fail: + HeapFree(GetProcessHeap(), 0, missing_arg); HeapFree(GetProcessHeap(), 0, prgpvarg); HeapFree(GetProcessHeap(), 0, rgvarg); HeapFree(GetProcessHeap(), 0, rgvt);