Robert Shearman : oleaut: Simplify missing argument handling in
ITypeInfo::Invoke.
Alexandre Julliard
julliard at wine.codeweavers.com
Mon Jan 16 14:37:56 CST 2006
Module: wine
Branch: refs/heads/master
Commit: 0f8db3fecac4ef1b8d30d571832d7b80aa319fc6
URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=0f8db3fecac4ef1b8d30d571832d7b80aa319fc6
Author: Robert Shearman <rob at 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);
More information about the wine-cvs
mailing list