Module: wine Branch: master Commit: 67c9b7cbb88bf24876bd35294e431e04624c714b URL: http://source.winehq.org/git/wine.git/?a=commit;h=67c9b7cbb88bf24876bd35294e...
Author: Alex Villacís Lasso a_villacis@palosanto.com Date: Tue Jan 2 18:51:28 2007 -0500
oleaut32: Support for VT_DISPATCH in VarDiv.
---
dlls/oleaut32/variant.c | 71 ++++++++++++++++++++++++++++++---------------- 1 files changed, 46 insertions(+), 25 deletions(-)
diff --git a/dlls/oleaut32/variant.c b/dlls/oleaut32/variant.c index 570b299..60af75d 100644 --- a/dlls/oleaut32/variant.c +++ b/dlls/oleaut32/variant.c @@ -3527,6 +3527,29 @@ HRESULT WINAPI VarDiv(LPVARIANT left, LP VARTYPE leftvt,rightvt; VARTYPE rightExtraFlags,leftExtraFlags,ExtraFlags; VARIANT lv,rv; + VARIANT tempLeft, tempRight; + + VariantInit(&tempLeft); + VariantInit(&tempRight); + VariantInit(&lv); + VariantInit(&rv); + + TRACE("(%p->(%s%s),%p->(%s%s),%p)\n", left, debugstr_VT(left), + debugstr_VF(left), right, debugstr_VT(right), debugstr_VF(right), result); + + /* Handle VT_DISPATCH by storing and taking address of returned value */ + 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; + }
leftvt = V_VT(left)&VT_TYPEMASK; rightvt = V_VT(right)&VT_TYPEMASK; @@ -3534,15 +3557,18 @@ HRESULT WINAPI VarDiv(LPVARIANT left, LP 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 VarPow always returns a error when using any extra flags */ + /* Native VarDiv always returns a error when using any extra flags */ if (ExtraFlags != 0) - return DISP_E_BADVARTYPE; + { + hres = DISP_E_BADVARTYPE; + goto end; + }
/* Determine return type */ if (!(rightvt == VT_EMPTY)) @@ -3550,7 +3576,8 @@ HRESULT WINAPI VarDiv(LPVARIANT left, LP if (leftvt == VT_NULL || rightvt == VT_NULL) { V_VT(result) = VT_NULL; - return S_OK; + hres = S_OK; + goto end; } else if (leftvt == VT_DECIMAL || rightvt == VT_DECIMAL) resvt = VT_DECIMAL; @@ -3580,30 +3607,21 @@ HRESULT WINAPI VarDiv(LPVARIANT left, LP else if (leftvt == VT_NULL && rightvt == VT_EMPTY) { V_VT(result) = VT_NULL; - return S_OK; + hres = S_OK; + goto end; } 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; @@ -3642,9 +3660,12 @@ HRESULT WINAPI VarDiv(LPVARIANT left, LP break; }
+end: VariantClear(&lv); VariantClear(&rv); - + VariantClear(&tempLeft); + VariantClear(&tempRight); + TRACE("returning 0x%8x (variant type %s)\n", hres, debugstr_VT(result)); return hres; }