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@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; }