Shuai Meng : vbscript: Fixed CBool handling.
Alexandre Julliard
julliard at winehq.org
Thu May 8 13:35:20 CDT 2014
Module: wine
Branch: master
Commit: b8aecb92b959eaf140a4e752b8caf911db391079
URL: http://source.winehq.org/git/wine.git/?a=commit;h=b8aecb92b959eaf140a4e752b8caf911db391079
Author: Shuai Meng <mengshuaicalendr at gmail.com>
Date: Sat May 3 10:14:26 2014 +0800
vbscript: Fixed CBool handling.
---
dlls/vbscript/global.c | 41 ++++++++++----------------------
dlls/vbscript/tests/api.vbs | 55 +++++++++++++++++++++++++++++++++++++++++++
2 files changed, 67 insertions(+), 29 deletions(-)
diff --git a/dlls/vbscript/global.c b/dlls/vbscript/global.c
index b89b888..9aeba34 100644
--- a/dlls/vbscript/global.c
+++ b/dlls/vbscript/global.c
@@ -114,16 +114,6 @@ static HRESULT return_int(VARIANT *res, int val)
return S_OK;
}
-static HRESULT return_bool(VARIANT *res, int val)
-{
- if(res) {
- V_VT(res) = VT_BOOL;
- V_BOOL(res) = val != 0 ? VARIANT_TRUE : VARIANT_FALSE;
- }
-
- return S_OK;
-}
-
static inline HRESULT return_double(VARIANT *res, double val)
{
if(res) {
@@ -413,30 +403,23 @@ static HRESULT Global_CLng(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARI
static HRESULT Global_CBool(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
{
- int val;
+ VARIANT v;
+ HRESULT hres;
+
TRACE("%s\n", debugstr_variant(arg));
assert(args_cnt == 1);
- switch(V_VT(arg)) {
- case VT_I2:
- val = V_I2(arg);
- break;
- case VT_I4:
- val = V_I4(arg);
- break;
- case VT_R4:
- val = V_R4(arg) > 0.0 || V_R4(arg) < 0.0;
- break;
- case VT_R8:
- val = V_R8(arg) > 0.0 || V_R8(arg) < 0.0;
- break;
- default:
- ERR("Not a numeric value: %s\n", debugstr_variant(arg));
- return E_FAIL;
- }
+ V_VT(&v) = VT_EMPTY;
+ hres = VariantChangeType(&v, arg, VARIANT_LOCALBOOL, VT_BOOL);
+ if(FAILED(hres))
+ return hres;
- return return_bool(res, val);
+ if(res)
+ *res = v;
+ else
+ VariantClear(&v);
+ return S_OK;
}
static HRESULT Global_CByte(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 ee9ebd3..12124b7 100644
--- a/dlls/vbscript/tests/api.vbs
+++ b/dlls/vbscript/tests/api.vbs
@@ -478,4 +478,59 @@ Call ok(getVT(CBool(0)) = "VT_BOOL", "getVT(CBool(0)) = " & getVT(CBool(0)))
Call ok(CBool(-5) = true, "CBool(-5) = " & CBool(-5))
Call ok(getVT(CBool(-5)) = "VT_BOOL", "getVT(CBool(-5)) = " & getVT(CBool(-5)))
+Sub testCBoolError(strings, error_num)
+ on error resume next
+
+ Call Err.clear()
+ Call CBool(strings)
+ Call ok(Err.number = error_num, "Err.number = " & Err.number)
+End Sub
+
+Class ValClass
+ Public myval
+
+ Public default Property Get defprop
+ defprop = myval
+ End Property
+End Class
+
+Dim MyObject
+Set MyObject = New ValClass
+
+Call ok(CBool(Empty) = False, "CBool(Empty) = " & CBool(Empty))
+Call ok(getVT(CBool(Empty)) = "VT_BOOL", "getVT(CBool(Empty)) = " & getVT(CBool(Empty)))
+Call ok(CBool(1) = True, "CBool(1) = " & CBool(1))
+Call ok(getVT(CBool(1)) = "VT_BOOL", "getVT(CBool(1)) = " & getVT(CBool(1)))
+Call ok(CBool(0) = False, "CBool(0) = " & CBool(0))
+Call ok(getVT(CBool(0)) = "VT_BOOL", "getVT(CBool(0)) = " & getVT(CBool(0)))
+Call ok(CBool(-0.56) = True, "CBool(-0.56) = " & CBool(-0.56))
+Call ok(getVT(CBool(-0.56)) = "VT_BOOL", "getVT(CBool(-0.56)) = " & getVT(CBool(-0.56)))
+Call testCBoolError("", 13)
+Call ok(CBool("0") = False, "CBool(""0"") = " & CBool("0"))
+Call ok(getVT(CBool("0")) = "VT_BOOL", "getVT(CBool(""0"")) = " & getVT(CBool("0")))
+If isEnglishLang Then
+ Call ok(CBool("0.1") = True, "CBool(""0.1"") = " & CBool("0.1"))
+ Call ok(getVT(CBool("0.1")) = "VT_BOOL", "getVT(CBool(""0.1"")) = " & getVT(CBool("0.1")))
+End If
+ Call ok(CBool("true") = True, "CBool(""true"") = " & CBool("true"))
+Call ok(getVT(CBool("true")) = "VT_BOOL", "getVT(CBool(""true"")) = " & getVT(CBool("true")))
+Call ok(CBool("false") = False, "CBool(""false"") = " & CBool("false"))
+Call ok(getVT(CBool("false")) = "VT_BOOL", "getVT(CBool(""false"")) = " & getVT(CBool("false")))
+Call ok(CBool("TRUE") = True, "CBool(""TRUE"") = " & CBool("TRUE"))
+Call ok(getVT(CBool("TRUE")) = "VT_BOOL", "getVT(CBool(""TRUE"")) = " & getVT(CBool("TRUE")))
+Call ok(CBool("FALSE") = False, "CBool(""FALSE"") = " & CBool("FALSE"))
+Call ok(getVT(CBool("FALSE")) = "VT_BOOL", "getVT(CBool(""FALSE"")) = " & getVT(CBool("FALSE")))
+Call ok(CBool("#TRUE#") = True, "CBool(""#TRUE#"") = " & CBool("#TRUE#"))
+Call ok(getVT(CBool("#TRUE#")) = "VT_BOOL", "getVT(CBool(""#TRUE#"")) = " & getVT(CBool("#TRUE#")))
+Call ok(CBool("#FALSE#") = False, "CBool(""#FALSE#"") = " & CBool("#FALSE#"))
+Call ok(getVT(CBool("#FALSE#")) = "VT_BOOL", "getVT(CBool(""#FALSE#"")) = " & getVT(CBool("#FALSE#")))
+Call ok(CBool(MyObject) = False, "CBool(MyObject) = " & CBool(MyObject))
+Call ok(getVT(CBool(MyObject)) = "VT_BOOL", "getVT(CBool(MyObject)) = " & getVT(CBool(MyObject)))
+MyObject.myval = 1
+Call ok(CBool(MyObject) = True, "CBool(MyObject) = " & CBool(MyObject))
+Call ok(getVT(CBool(MyObject)) = "VT_BOOL", "getVT(CBool(MyObject)) = " & getVT(CBool(MyObject)))
+MyObject.myval = 0
+Call ok(CBool(MyObject) = False, "CBool(MyObject) = " & CBool(MyObject))
+Call ok(getVT(CBool(MyObject)) = "VT_BOOL", "getVT(CBool(MyObject)) = " & getVT(CBool(MyObject)))
+
Call reportSuccess()
More information about the wine-cvs
mailing list