oleaut32: Support for VT_DISPATCH in VarAdd.
This commit is contained in:
parent
97d13c552c
commit
308a0b2e18
|
@ -3130,6 +3130,7 @@ HRESULT WINAPI VarAdd(LPVARIANT left, LPVARIANT right, LPVARIANT result)
|
||||||
HRESULT hres;
|
HRESULT hres;
|
||||||
VARTYPE lvt, rvt, resvt, tvt;
|
VARTYPE lvt, rvt, resvt, tvt;
|
||||||
VARIANT lv, rv, tv;
|
VARIANT lv, rv, tv;
|
||||||
|
VARIANT tempLeft, tempRight;
|
||||||
double r8res;
|
double r8res;
|
||||||
|
|
||||||
/* Variant priority for coercion. Sorted from lowest to highest.
|
/* Variant priority for coercion. Sorted from lowest to highest.
|
||||||
|
@ -3161,6 +3162,26 @@ HRESULT WINAPI VarAdd(LPVARIANT left, LPVARIANT right, LPVARIANT result)
|
||||||
VariantInit(&lv);
|
VariantInit(&lv);
|
||||||
VariantInit(&rv);
|
VariantInit(&rv);
|
||||||
VariantInit(&tv);
|
VariantInit(&tv);
|
||||||
|
VariantInit(&tempLeft);
|
||||||
|
VariantInit(&tempRight);
|
||||||
|
|
||||||
|
/* Handle VT_DISPATCH by storing and taking address of returned value */
|
||||||
|
if ((V_VT(left) & VT_TYPEMASK) != VT_NULL && (V_VT(right) & VT_TYPEMASK) != VT_NULL)
|
||||||
|
{
|
||||||
|
if ((V_VT(left) & VT_TYPEMASK) == VT_DISPATCH)
|
||||||
|
{
|
||||||
|
hres = VARIANT_FetchDispatchValue(left, &tempLeft);
|
||||||
|
if (FAILED(hres)) goto end;
|
||||||
|
left = &tempLeft;
|
||||||
|
}
|
||||||
|
if ((V_VT(right) & VT_TYPEMASK) == VT_DISPATCH)
|
||||||
|
{
|
||||||
|
hres = VARIANT_FetchDispatchValue(right, &tempRight);
|
||||||
|
if (FAILED(hres)) goto end;
|
||||||
|
right = &tempRight;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
lvt = V_VT(left)&VT_TYPEMASK;
|
lvt = V_VT(left)&VT_TYPEMASK;
|
||||||
rvt = V_VT(right)&VT_TYPEMASK;
|
rvt = V_VT(right)&VT_TYPEMASK;
|
||||||
|
|
||||||
|
@ -3288,6 +3309,8 @@ end:
|
||||||
VariantClear(&lv);
|
VariantClear(&lv);
|
||||||
VariantClear(&rv);
|
VariantClear(&rv);
|
||||||
VariantClear(&tv);
|
VariantClear(&tv);
|
||||||
|
VariantClear(&tempLeft);
|
||||||
|
VariantClear(&tempRight);
|
||||||
TRACE("returning 0x%8x (variant type %s)\n", hres, debugstr_VT(result));
|
TRACE("returning 0x%8x (variant type %s)\n", hres, debugstr_VT(result));
|
||||||
return hres;
|
return hres;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue