Robert Shearman : oleaut: Only allocate memory once for each array needed for the

Alexandre Julliard julliard at wine.codeweavers.com
Mon Jan 16 14:37:57 CST 2006


Module: wine
Branch: refs/heads/master
Commit: d86f8d2ef2e12b66af5b0bd056e23d83e58eb874
URL:    http://source.winehq.org/git/?p=wine.git;a=commit;h=d86f8d2ef2e12b66af5b0bd056e23d83e58eb874

Author: Robert Shearman <rob at codeweavers.com>
Date:   Mon Jan 16 20:43:55 2006 +0100

oleaut: Only allocate memory once for each array needed for the
arguments in ITypeInfo::Invoke.

---

 dlls/oleaut32/typelib.c |   28 +++++++++++++++++++---------
 1 files changed, 19 insertions(+), 9 deletions(-)

diff --git a/dlls/oleaut32/typelib.c b/dlls/oleaut32/typelib.c
index 14aa8cd..9799b5b 100644
--- a/dlls/oleaut32/typelib.c
+++ b/dlls/oleaut32/typelib.c
@@ -5167,6 +5167,17 @@ DispCallFunc(
     return S_OK;
 }
 
+#define INVBUF_ELEMENT_SIZE \
+    (sizeof(VARIANTARG) + sizeof(VARIANTARG) + sizeof(VARIANTARG *) + sizeof(VARTYPE))
+#define INVBUF_GET_ARG_ARRAY(buffer, params) \
+    ((VARIANTARG *)(buffer))
+#define INVBUF_GET_MISSING_ARG_ARRAY(buffer, params) \
+    ((VARIANTARG *)((char *)(buffer) + sizeof(VARIANTARG) * (params)))
+#define INVBUF_GET_ARG_PTR_ARRAY(buffer, params) \
+    ((VARIANTARG **)((char *)(buffer) + (sizeof(VARIANTARG) + sizeof(VARIANTARG)) * (params)))
+#define INVBUF_GET_ARG_TYPE_ARRAY(buffer, params) \
+    ((VARTYPE *)((char *)(buffer) + (sizeof(VARIANTARG) + sizeof(VARIANTARG) + sizeof(VARIANTARG *)) * (params)))
+
 static HRESULT WINAPI ITypeInfo_fnInvoke(
     ITypeInfo2 *iface,
     VOID  *pIUnk,
@@ -5207,12 +5218,12 @@ static HRESULT WINAPI ITypeInfo_fnInvoke
 	switch (func_desc->funckind) {
 	case FUNC_PUREVIRTUAL:
 	case FUNC_VIRTUAL: {
-            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);
+            void *buffer = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, INVBUF_ELEMENT_SIZE * func_desc->cParams);
             VARIANT varresult;
             VARIANT retval; /* pointer for storing byref retvals in */
+            VARIANTARG **prgpvarg = INVBUF_GET_ARG_PTR_ARRAY(buffer, func_desc->cParams);
+            VARIANTARG *rgvarg = INVBUF_GET_ARG_ARRAY(buffer, func_desc->cParams);
+            VARTYPE *rgvt = INVBUF_GET_ARG_TYPE_ARRAY(buffer, func_desc->cParams);
 
             hres = S_OK;
             for (i = 0; i < func_desc->cParams; i++)
@@ -5227,6 +5238,7 @@ static HRESULT WINAPI ITypeInfo_fnInvoke
             for (i = 0; i < func_desc->cParams; i++)
             {
                 USHORT wParamFlags = func_desc->lprgelemdescParam[i].u.paramdesc.wParamFlags;
+
                 if (wParamFlags & PARAMFLAG_FRETVAL)
                 {
                     /* note: this check is placed so that if the caller passes
@@ -5275,6 +5287,7 @@ static HRESULT WINAPI ITypeInfo_fnInvoke
                     }
                     else
                     {
+                        VARIANTARG *missing_arg = INVBUF_GET_MISSING_ARG_ARRAY(buffer, func_desc->cParams);
                         V_VT(arg) = VT_VARIANT | VT_BYREF;
                         V_VARIANTREF(arg) = &missing_arg[i];
                         V_VT(V_VARIANTREF(arg)) = VT_ERROR;
@@ -5310,7 +5323,7 @@ static HRESULT WINAPI ITypeInfo_fnInvoke
                 {
                     if (TRACE_ON(ole))
                     {
-                        TRACE("varresult: ");
+                        TRACE("[retval] value: ");
                         dump_Variant(prgpvarg[i]);
                     }
 
@@ -5362,10 +5375,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);
+            HeapFree(GetProcessHeap(), 0, buffer);
             break;
         }
 	case FUNC_DISPATCH:  {




More information about the wine-cvs mailing list