Module: wine Branch: master Commit: 5aacee9550cac739ad7ae43e527dd29fade4668f URL: http://source.winehq.org/git/wine.git/?a=commit;h=5aacee9550cac739ad7ae43e52...
Author: Alex Villacís Lasso a_villacis@palosanto.com Date: Tue Jan 2 18:53:37 2007 -0500
oleaut32: Support for VT_DISPATCH in VarXor.
---
dlls/oleaut32/variant.c | 25 ++++++++++++++++++++++++- 1 files changed, 24 insertions(+), 1 deletions(-)
diff --git a/dlls/oleaut32/variant.c b/dlls/oleaut32/variant.c index 318ebfc..2a90b06 100644 --- a/dlls/oleaut32/variant.c +++ b/dlls/oleaut32/variant.c @@ -4520,6 +4520,7 @@ HRESULT WINAPI VarXor(LPVARIANT pVarLeft { VARTYPE vt; VARIANT varLeft, varRight; + VARIANT tempLeft, tempRight; double d; HRESULT hRet;
@@ -4542,6 +4543,23 @@ HRESULT WINAPI VarXor(LPVARIANT pVarLeft return S_OK; }
+ VariantInit(&tempLeft); + VariantInit(&tempRight); + + /* Handle VT_DISPATCH by storing and taking address of returned value */ + if ((V_VT(pVarLeft) & VT_TYPEMASK) == VT_DISPATCH) + { + hRet = VARIANT_FetchDispatchValue(pVarLeft, &tempLeft); + if (FAILED(hRet)) goto VarXor_Exit; + pVarLeft = &tempLeft; + } + if ((V_VT(pVarRight) & VT_TYPEMASK) == VT_DISPATCH) + { + hRet = VARIANT_FetchDispatchValue(pVarRight, &tempRight); + if (FAILED(hRet)) goto VarXor_Exit; + pVarRight = &tempRight; + } + /* Copy our inputs so we don't disturb anything */ V_VT(&varLeft) = V_VT(&varRight) = VT_EMPTY;
@@ -4576,7 +4594,10 @@ HRESULT WINAPI VarXor(LPVARIANT pVarLeft if (V_VT(&varLeft) == VT_I8 || V_VT(&varRight) == VT_I8) { if (V_VT(pVarLeft) == VT_INT || V_VT(pVarRight) == VT_INT) - return DISP_E_TYPEMISMATCH; + { + hRet = DISP_E_TYPEMISMATCH; + goto VarXor_Exit; + } vt = VT_I8; } else @@ -4654,6 +4675,8 @@ HRESULT WINAPI VarXor(LPVARIANT pVarLeft VarXor_Exit: VariantClear(&varLeft); VariantClear(&varRight); + VariantClear(&tempLeft); + VariantClear(&tempRight); return hRet; }