Jacek Caban : vbscript: Use VariantChangeType in to_int.

Alexandre Julliard julliard at wine.codeweavers.com
Mon Jul 21 13:37:11 CDT 2014


Module: wine
Branch: master
Commit: 15dfae71a12f4937c363156849213881c879c684
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=15dfae71a12f4937c363156849213881c879c684

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Mon Jul 21 16:05:14 2014 +0200

vbscript: Use VariantChangeType in to_int.

---

 dlls/vbscript/global.c      | 54 +++++++++++----------------------------------
 dlls/vbscript/tests/api.vbs |  3 +++
 2 files changed, 16 insertions(+), 41 deletions(-)

diff --git a/dlls/vbscript/global.c b/dlls/vbscript/global.c
index af7a27d..610de43 100644
--- a/dlls/vbscript/global.c
+++ b/dlls/vbscript/global.c
@@ -142,41 +142,15 @@ static inline HRESULT return_date(VARIANT *res, double date)
 
 HRESULT to_int(VARIANT *v, int *ret)
 {
-    if(V_VT(v) == (VT_BYREF|VT_VARIANT))
-        v = V_VARIANTREF(v);
-
-    switch(V_VT(v)) {
-    case VT_I2:
-        *ret = V_I2(v);
-        break;
-    case VT_I4:
-        *ret = V_I4(v);
-        break;
-    case VT_R8: {
-        double n = floor(V_R8(v)+0.5);
-        INT32 i;
-
-        if(!is_int32(n)) {
-            FIXME("%lf is out of int range\n", n);
-            return E_FAIL;
-        }
-
-        /* Round half to even */
-        i = n;
-        if(i%2 && n-V_R8(v) == 0.5)
-            i--;
+    VARIANT r;
+    HRESULT hres;
 
-        *ret = i;
-        break;
-    }
-    case VT_BOOL:
-        *ret = V_BOOL(v) ? -1 : 0;
-        break;
-    default:
-        FIXME("not supported %s\n", debugstr_variant(v));
-        return E_NOTIMPL;
-    }
+    V_VT(&r) = VT_EMPTY;
+    hres = VariantChangeType(&r, v, 0, VT_I4);
+    if(FAILED(hres))
+        return hres;
 
+    *ret = V_I4(&r);
     return S_OK;
 }
 
@@ -400,24 +374,22 @@ static HRESULT Global_CInt(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARI
 
 static HRESULT Global_CLng(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
 {
-    VARIANT v;
+    int i;
     HRESULT hres;
 
     TRACE("%s\n", debugstr_variant(arg));
 
     assert(args_cnt == 1);
 
-    V_VT(&v) = VT_EMPTY;
-    hres = VariantChangeType(&v, arg, 0, VT_I4);
+    hres = to_int(arg, &i);
     if(FAILED(hres))
         return hres;
-
     if(!res)
         return DISP_E_BADVARTYPE;
-    else {
-        *res = v;
-        return S_OK;
-    }
+
+    V_VT(res) = VT_I4;
+    V_I4(res) = i;
+    return S_OK;
 }
 
 static HRESULT Global_CBool(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
diff --git a/dlls/vbscript/tests/api.vbs b/dlls/vbscript/tests/api.vbs
index 813f5e8..38e5e76 100644
--- a/dlls/vbscript/tests/api.vbs
+++ b/dlls/vbscript/tests/api.vbs
@@ -136,6 +136,7 @@ Call ok(Chr(120) = "x", "Chr(120) = " & Chr(120))
 Call ok(Chr(0) <> "", "Chr(0) = """"")
 Call ok(Chr(120.5) = "x", "Chr(120.5) = " & Chr(120.5))
 Call ok(Chr(119.5) = "x", "Chr(119.5) = " & Chr(119.5))
+Call ok(Chr("120") = "x", "Chr(""120"") = " & Chr("120"))
 
 sub testChrError
     on error resume next
@@ -321,6 +322,7 @@ Call ok(Space(5.5) = "      ", "Space(5.5) = " & Space(5.5) & """")
 Call ok(Space(4.5) = "    ", "Space(4.5) = " & Space(4.5) & """")
 Call ok(Space(0.5) = "", "Space(0.5) = " & Space(0.5) & """")
 Call ok(Space(1.5) = "  ", "Space(1.5) = " & Space(1.5) & """")
+Call ok(Space("1") = " ", "Space(""1"") = " & Space("1") & """")
 
 Sub TestStrReverse(str, ex)
     Call ok(StrReverse(str) = ex, "StrReverse(" & str & ") = " & StrReverse(str))
@@ -341,6 +343,7 @@ TestLeft "test", 0, ""
 TestLeft 123, 2, "12"
 TestLeft "123456", 1.5, "12"
 TestLeft "123456", 2.5, "12"
+TestLeft "test", "2", "te"
 if isEnglishLang then TestLeft true, 2, "Tr"
 
 Sub TestRight(str, len, ex)




More information about the wine-cvs mailing list