Alex Villacís Lasso : oleaut32: Support for VT_DISPATCH in VarIdiv.
Module: wine Branch: master Commit: cdceb02319238a2bcbb337d69d3497847164663d URL: http://source.winehq.org/git/wine.git/?a=commit;h=cdceb02319238a2bcbb337d69d... Author: Alex Villacís Lasso <a_villacis(a)palosanto.com> Date: Tue Jan 2 18:54:20 2007 -0500 oleaut32: Support for VT_DISPATCH in VarIdiv. --- dlls/oleaut32/variant.c | 50 ++++++++++++++++++++++++++-------------------- 1 files changed, 28 insertions(+), 22 deletions(-) diff --git a/dlls/oleaut32/variant.c b/dlls/oleaut32/variant.c index 2a90b06..7233ef9 100644 --- a/dlls/oleaut32/variant.c +++ b/dlls/oleaut32/variant.c @@ -5109,6 +5109,15 @@ HRESULT WINAPI VarIdiv(LPVARIANT left, L VARTYPE leftvt,rightvt; VARTYPE rightExtraFlags,leftExtraFlags,ExtraFlags; VARIANT lv,rv; + VARIANT tempLeft, tempRight; + + TRACE("(%p->(%s%s),%p->(%s%s),%p)\n", left, debugstr_VT(left), + debugstr_VF(left), right, debugstr_VT(right), debugstr_VF(right), result); + + VariantInit(&lv); + VariantInit(&rv); + VariantInit(&tempLeft); + VariantInit(&tempRight); leftvt = V_VT(left)&VT_TYPEMASK; rightvt = V_VT(right)&VT_TYPEMASK; @@ -5116,12 +5125,12 @@ HRESULT WINAPI VarIdiv(LPVARIANT left, L rightExtraFlags = V_VT(right)&(~VT_TYPEMASK); if (leftExtraFlags != rightExtraFlags) - return DISP_E_BADVARTYPE; + { + hres = DISP_E_BADVARTYPE; + goto end; + } ExtraFlags = leftExtraFlags; - TRACE("(%p->(%s%s),%p->(%s%s),%p)\n", left, debugstr_VT(left), - debugstr_VF(left), right, debugstr_VT(right), debugstr_VF(right), result); - /* Native VarIdiv always returns a error when using any extra * flags or if the variant combination is I8 and INT. */ @@ -5129,13 +5138,17 @@ HRESULT WINAPI VarIdiv(LPVARIANT left, L (leftvt == VT_INT && rightvt == VT_I8) || (rightvt == VT_EMPTY && leftvt != VT_NULL) || ExtraFlags != 0) - return DISP_E_BADVARTYPE; + { + hres = DISP_E_BADVARTYPE; + goto end; + } /* Determine variant type */ else if (leftvt == VT_NULL || rightvt == VT_NULL) { V_VT(result) = VT_NULL; - return S_OK; + hres = S_OK; + goto end; } else if (leftvt == VT_I8 || rightvt == VT_I8) resvt = VT_I8; @@ -5160,26 +5173,16 @@ HRESULT WINAPI VarIdiv(LPVARIANT left, L else if (leftvt == VT_UI1 || rightvt == VT_UI1) resvt = VT_UI1; else - return DISP_E_BADVARTYPE; - - VariantInit(&lv); - VariantInit(&rv); + { + hres = DISP_E_BADVARTYPE; + goto end; + } /* coerce to the result type */ hres = VariantChangeType(&lv, left, 0, resvt); - if (hres != S_OK) - { - VariantClear(&lv); - VariantClear(&rv); - return hres; - } + if (hres != S_OK) goto end; hres = VariantChangeType(&rv, right, 0, resvt); - if (hres != S_OK) - { - VariantClear(&lv); - VariantClear(&rv); - return hres; - } + if (hres != S_OK) goto end; /* do the math */ V_VT(result) = resvt; @@ -5226,8 +5229,11 @@ HRESULT WINAPI VarIdiv(LPVARIANT left, L leftvt,rightvt); } +end: VariantClear(&lv); VariantClear(&rv); + VariantClear(&tempLeft); + VariantClear(&tempRight); return hres; }
participants (1)
-
Alexandre Julliard