From: Francis De Brabandere <francisdb@gmail.com> VT_I8/UI8/I1/UI2/UI4/UINT cannot be produced by VBScript natively; they arrive only via COM dispatch. Extend testobj with read-only properties returning each of these VTs and exercise BSTR-vs-numeric comparison against them. The non-literal dispatch path goes through string compare against CStr(numeric), so all six cases should behave like VT_UI1/VT_CY. --- dlls/vbscript/tests/lang.vbs | 44 ++++++++++++++++++++++++++++++++++++ dlls/vbscript/tests/run.c | 37 ++++++++++++++++++++++++++++++ 2 files changed, 81 insertions(+) diff --git a/dlls/vbscript/tests/lang.vbs b/dlls/vbscript/tests/lang.vbs index c3c79a47d06..c665fada078 100644 --- a/dlls/vbscript/tests/lang.vbs +++ b/dlls/vbscript/tests/lang.vbs @@ -230,6 +230,50 @@ Call ok(not ("" = CCur(0)), """"" = CCur(0) should be false (no error)") Call ok(not ("10" > CByte(5)), """10"" > CByte(5) should be false (lex)") Call ok(not ("5" < CCur(10)), """5"" < CCur(10) should be false (lex)") +' VT_I8/UI8/I1/UI2/UI4/UINT cannot be produced by VBScript natively; obtain +' them via a host IDispatch (testobj). Native VBScript: +' - VT_UI8/UI2/UI4/UINT: error 458 (VBSE_INVALID_TYPELIB_VARIABLE) on +' both 32-bit and 64-bit when used in any expression. +' - VT_I8: error 458 on 32-bit; on 64-bit no error but BSTR-vs-I8 compares +' as not-equal (no CStr coercion of the numeric side). +' - VT_I1: no error on either arch (treated as a small integer). +Dim x_str : x_str = "5" +Dim cmp_result +On Error Resume Next + +' VT_I8 vs non-literal BSTR. 32-bit: err 458. 64-bit: cmp = False. +Err.Clear : cmp_result = (x_str = testobj.i8val) : saved_err = Err.number : Err.Clear +Call todo_wine_ok(saved_err = 458 or cmp_result = False, _ + "x_str = testobj.i8val: err=" & saved_err & " result=" & cmp_result) + +' VT_UI8/I1/UI2/UI4/UINT: native errors 458 on both archs. +Err.Clear : cmp_result = ("5" = testobj.ui8val) : saved_err = Err.number : Err.Clear +Call todo_wine_ok(saved_err = 458, _ + "BSTR = testobj.ui8val should err 458, got " & saved_err) + +' VT_I1: native does not raise 458 (treated like a small integer); BSTR +' literal vs I1 should compare equal via numeric coercion, matching the +' baseline "5" = CInt(5) behavior. +Err.Clear : cmp_result = ("5" = testobj.i1val) : saved_err = Err.number : Err.Clear +Call ok(saved_err = 0, _ + "BSTR = testobj.i1val should not error, got " & saved_err & " result=" & cmp_result) +Call ok(cmp_result = True, _ + "BSTR = testobj.i1val should be true, got " & cmp_result) + +Err.Clear : cmp_result = ("5" = testobj.ui2val) : saved_err = Err.number : Err.Clear +Call todo_wine_ok(saved_err = 458, _ + "BSTR = testobj.ui2val should err 458, got " & saved_err) + +Err.Clear : cmp_result = ("5" = testobj.ui4val) : saved_err = Err.number : Err.Clear +Call todo_wine_ok(saved_err = 458, _ + "BSTR = testobj.ui4val should err 458, got " & saved_err) + +Err.Clear : cmp_result = ("5" = testobj.uintval) : saved_err = Err.number : Err.Clear +Call todo_wine_ok(saved_err = 458, _ + "BSTR = testobj.uintval should err 458, got " & saved_err) + +On Error Goto 0 + ' --- BSTR vs numeric LITERAL: BSTR coerces to a number, parse failure raises 13. --- Dim saved_err on error resume next diff --git a/dlls/vbscript/tests/run.c b/dlls/vbscript/tests/run.c index a0fbe322ccf..ac8cf81fe55 100644 --- a/dlls/vbscript/tests/run.c +++ b/dlls/vbscript/tests/run.c @@ -152,6 +152,12 @@ DEFINE_EXPECT(OnLeaveScript); #define DISPID_TESTOBJ_PROPGET 2000 #define DISPID_TESTOBJ_PROPPUT 2001 #define DISPID_TESTOBJ_KEYWORD 2002 +#define DISPID_TESTOBJ_I8VAL 2003 +#define DISPID_TESTOBJ_UI8VAL 2004 +#define DISPID_TESTOBJ_I1VAL 2005 +#define DISPID_TESTOBJ_UI2VAL 2006 +#define DISPID_TESTOBJ_UI4VAL 2007 +#define DISPID_TESTOBJ_UINTVAL 2008 #define DISPID_COLLOBJ_RESET 3000 @@ -846,6 +852,12 @@ static HRESULT WINAPI testObj_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD static const dispid_t dispids[] = { { L"propget", DISPID_TESTOBJ_PROPGET, REF_EXPECT(testobj_propget_d) }, { L"propput", DISPID_TESTOBJ_PROPPUT, REF_EXPECT(testobj_propput_d) }, + { L"i8val", DISPID_TESTOBJ_I8VAL }, + { L"ui8val", DISPID_TESTOBJ_UI8VAL }, + { L"i1val", DISPID_TESTOBJ_I1VAL }, + { L"ui2val", DISPID_TESTOBJ_UI2VAL }, + { L"ui4val", DISPID_TESTOBJ_UI4VAL }, + { L"uintval", DISPID_TESTOBJ_UINTVAL }, { L"rem", DISPID_TESTOBJ_KEYWORD }, { L"true", DISPID_TESTOBJ_KEYWORD }, { L"false", DISPID_TESTOBJ_KEYWORD }, @@ -994,6 +1006,31 @@ static HRESULT WINAPI testObj_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid, V_VT(pvarRes) = VT_I2; V_I2(pvarRes) = 10; return S_OK; + + case DISPID_TESTOBJ_I8VAL: + V_VT(pvarRes) = VT_I8; + V_I8(pvarRes) = 5; + return S_OK; + case DISPID_TESTOBJ_UI8VAL: + V_VT(pvarRes) = VT_UI8; + V_UI8(pvarRes) = 5; + return S_OK; + case DISPID_TESTOBJ_I1VAL: + V_VT(pvarRes) = VT_I1; + V_I1(pvarRes) = 5; + return S_OK; + case DISPID_TESTOBJ_UI2VAL: + V_VT(pvarRes) = VT_UI2; + V_UI2(pvarRes) = 5; + return S_OK; + case DISPID_TESTOBJ_UI4VAL: + V_VT(pvarRes) = VT_UI4; + V_UI4(pvarRes) = 5; + return S_OK; + case DISPID_TESTOBJ_UINTVAL: + V_VT(pvarRes) = VT_UINT; + V_UINT(pvarRes) = 5; + return S_OK; } ok(0, "unexpected call %ld\n", id); -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10775