[pkg-wine-party] [SCM] Debian Wine packaging branch, wheezy, updated. wine-1.4-7-302-gb61b690

Alexandre Julliard julliard at winehq.org
Sun Jun 17 20:02:26 UTC 2012


The following commit has been merged in the wheezy branch:
commit a2e0ca5a1fc12f8c00bbd0b44c42a98a964d36b8
Author: Alessandro Pignotti <a.pignotti at sssup.it>
Date:   Thu Feb 2 19:02:17 2012 +0100

    oleaut32: Avoid converting variants if it is not needed.
    (cherry picked from commit 25d6e9aee86c7fce2970889ba850df156e727b14)

diff --git a/dlls/oleaut32/typelib.c b/dlls/oleaut32/typelib.c
index 95cdc36..302edbf 100644
--- a/dlls/oleaut32/typelib.c
+++ b/dlls/oleaut32/typelib.c
@@ -6427,83 +6427,90 @@ static HRESULT WINAPI ITypeInfo_fnInvoke(
                 {
                     dump_Variant(src_arg);
 
-                    if (rgvt[i] == VT_VARIANT)
-                        hres = VariantCopy(&rgvarg[i], src_arg);
-                    else if (rgvt[i] == (VT_VARIANT | VT_BYREF))
+                    if(rgvt[i]!=V_VT(src_arg))
                     {
-                        if (rgvt[i] == V_VT(src_arg))
-                            V_VARIANTREF(&rgvarg[i]) = V_VARIANTREF(src_arg);
-                        else
+                        if (rgvt[i] == VT_VARIANT)
+                            hres = VariantCopy(&rgvarg[i], src_arg);
+                        else if (rgvt[i] == (VT_VARIANT | VT_BYREF))
+                        {
+                            if (rgvt[i] == V_VT(src_arg))
+                                V_VARIANTREF(&rgvarg[i]) = V_VARIANTREF(src_arg);
+                            else
+                            {
+                                VARIANTARG *missing_arg = INVBUF_GET_MISSING_ARG_ARRAY(buffer, func_desc->cParams);
+                                if (wParamFlags & PARAMFLAG_FIN)
+                                    hres = VariantCopy(&missing_arg[i], src_arg);
+                                V_VARIANTREF(&rgvarg[i]) = &missing_arg[i];
+                            }
+                            V_VT(&rgvarg[i]) = rgvt[i];
+                        }
+                        else if (rgvt[i] == (VT_VARIANT | VT_ARRAY) && func_desc->cParamsOpt < 0 && i == func_desc->cParams-1)
+                        {
+                            SAFEARRAY *a;
+                            SAFEARRAYBOUND bound;
+                            VARIANT *v;
+                            LONG j;
+                            bound.lLbound = 0;
+                            bound.cElements = pDispParams->cArgs-i;
+                            if (!(a = SafeArrayCreate(VT_VARIANT, 1, &bound)))
+                            {
+                                ERR("SafeArrayCreate failed\n");
+                                break;
+                            }
+                            hres = SafeArrayAccessData(a, (LPVOID)&v);
+                            if (hres != S_OK)
+                            {
+                                ERR("SafeArrayAccessData failed with %x\n", hres);
+                                break;
+                            }
+                            for (j = 0; j < bound.cElements; j++)
+                                VariantCopy(&v[j], &pDispParams->rgvarg[pDispParams->cArgs - 1 - i - j]);
+                            hres = SafeArrayUnaccessData(a);
+                            if (hres != S_OK)
+                            {
+                                ERR("SafeArrayUnaccessData failed with %x\n", hres);
+                                break;
+                            }
+                            V_ARRAY(&rgvarg[i]) = a;
+                            V_VT(&rgvarg[i]) = rgvt[i];
+                        }
+                        else if ((rgvt[i] & VT_BYREF) && !V_ISBYREF(src_arg))
                         {
                             VARIANTARG *missing_arg = INVBUF_GET_MISSING_ARG_ARRAY(buffer, func_desc->cParams);
                             if (wParamFlags & PARAMFLAG_FIN)
-                                hres = VariantCopy(&missing_arg[i], src_arg);
-                            V_VARIANTREF(&rgvarg[i]) = &missing_arg[i];
+                                hres = VariantChangeType(&missing_arg[i], src_arg, 0, rgvt[i] & ~VT_BYREF);
+                            else
+                                V_VT(&missing_arg[i]) = rgvt[i] & ~VT_BYREF;
+                            V_BYREF(&rgvarg[i]) = &V_NONE(&missing_arg[i]);
+                            V_VT(&rgvarg[i]) = rgvt[i];
                         }
-                        V_VT(&rgvarg[i]) = rgvt[i];
-                    }
-                    else if (rgvt[i] == (VT_VARIANT | VT_ARRAY) && func_desc->cParamsOpt < 0 && i == func_desc->cParams-1)
-                    {
-                        SAFEARRAY *a;
-                        SAFEARRAYBOUND bound;
-                        VARIANT *v;
-                        LONG j;
-                        bound.lLbound = 0;
-                        bound.cElements = pDispParams->cArgs-i;
-                        if (!(a = SafeArrayCreate(VT_VARIANT, 1, &bound)))
+                        else if ((rgvt[i] & VT_BYREF) && (rgvt[i] == V_VT(src_arg)))
                         {
-                            ERR("SafeArrayCreate failed\n");
-                            break;
+                            V_BYREF(&rgvarg[i]) = V_BYREF(src_arg);
+                            V_VT(&rgvarg[i]) = rgvt[i];
                         }
-                        hres = SafeArrayAccessData(a, (LPVOID)&v);
-                        if (hres != S_OK)
+                        else
                         {
-                            ERR("SafeArrayAccessData failed with %x\n", hres);
-                            break;
+                            /* FIXME: this doesn't work for VT_BYREF arguments if
+                             * they are not the same type as in the paramdesc */
+                            V_VT(&rgvarg[i]) = V_VT(src_arg);
+                            hres = VariantChangeType(&rgvarg[i], src_arg, 0, rgvt[i]);
+                            V_VT(&rgvarg[i]) = rgvt[i];
                         }
-                        for (j = 0; j < bound.cElements; j++)
-                            VariantCopy(&v[j], &pDispParams->rgvarg[pDispParams->cArgs - 1 - i - j]);
-                        hres = SafeArrayUnaccessData(a);
-                        if (hres != S_OK)
+
+                        if (FAILED(hres))
                         {
-                            ERR("SafeArrayUnaccessData failed with %x\n", hres);
+                            ERR("failed to convert param %d to %s%s from %s%s\n", i,
+                                debugstr_vt(rgvt[i]), debugstr_vf(rgvt[i]),
+                                debugstr_VT(src_arg), debugstr_VF(src_arg));
                             break;
                         }
-                        V_ARRAY(&rgvarg[i]) = a;
-                        V_VT(&rgvarg[i]) = rgvt[i];
-                    }
-                    else if ((rgvt[i] & VT_BYREF) && !V_ISBYREF(src_arg))
-                    {
-                        VARIANTARG *missing_arg = INVBUF_GET_MISSING_ARG_ARRAY(buffer, func_desc->cParams);
-                        if (wParamFlags & PARAMFLAG_FIN)
-                            hres = VariantChangeType(&missing_arg[i], src_arg, 0, rgvt[i] & ~VT_BYREF);
-                        else
-                            V_VT(&missing_arg[i]) = rgvt[i] & ~VT_BYREF;
-                        V_BYREF(&rgvarg[i]) = &V_NONE(&missing_arg[i]);
-                        V_VT(&rgvarg[i]) = rgvt[i];
-                    }
-                    else if ((rgvt[i] & VT_BYREF) && (rgvt[i] == V_VT(src_arg)))
-                    {
-                        V_BYREF(&rgvarg[i]) = V_BYREF(src_arg);
-                        V_VT(&rgvarg[i]) = rgvt[i];
+                        prgpvarg[i] = &rgvarg[i];
                     }
                     else
                     {
-                        /* FIXME: this doesn't work for VT_BYREF arguments if
-                         * they are not the same type as in the paramdesc */
-                        V_VT(&rgvarg[i]) = V_VT(src_arg);
-                        hres = VariantChangeType(&rgvarg[i], src_arg, 0, rgvt[i]);
-                        V_VT(&rgvarg[i]) = rgvt[i];
-                    }
-
-                    if (FAILED(hres))
-                    {
-                        ERR("failed to convert param %d to %s%s from %s%s\n", i,
-                            debugstr_vt(rgvt[i]), debugstr_vf(rgvt[i]),
-                            debugstr_VT(src_arg), debugstr_VF(src_arg));
-                        break;
+                        prgpvarg[i] = src_arg;
                     }
-                    prgpvarg[i] = &rgvarg[i];
                 }
                 else if (wParamFlags & PARAMFLAG_FOPT)
                 {

-- 
Debian Wine packaging



More information about the pkg-wine-party mailing list