[PATCH v12 0/2] MR7070: Draft: vbscript: redim without dim
fixes https://bugs.winehq.org/show_bug.cgi?id=53767 -- v12: vbscript: fix Mid() empty and null handling vbscript: refactor Mid() error tests https://gitlab.winehq.org/wine/wine/-/merge_requests/7070
From: Francis De Brabandere <francisdb(a)gmail.com> --- dlls/vbscript/tests/api.vbs | 68 +++++++++++++------------------------ 1 file changed, 23 insertions(+), 45 deletions(-) diff --git a/dlls/vbscript/tests/api.vbs b/dlls/vbscript/tests/api.vbs index 7b8744f4c74..296663d9c97 100644 --- a/dlls/vbscript/tests/api.vbs +++ b/dlls/vbscript/tests/api.vbs @@ -632,6 +632,15 @@ Sub TestMid2(str, start, ex) Call ok(x = ex, "Mid(" & str & ", " & start & ") = " & x & " expected " & ex) End Sub +Sub TestMidError(str, start, len, number) + On Error Resume Next + Call Mid(str, start, len) + Dim err_num: err_num = Err.number + Call Err.clear() + On Error GoTo 0 + Call ok(err_num = number, "Mid(" & str & ", " & start & ", " & len & ") " & " expected Err.number = " & number) +End Sub + TestMid "test", 2, 2, "es" TestMid "test", 2, 4, "est" TestMid "test", 1, 2, "te" @@ -646,51 +655,20 @@ TestMid2 "test", 4, "t" TestMid2 "test", 5, "" TestMid2 1234, 5, "" -sub TestMidError() - on error resume next - call Err.clear() - call Mid("test", "a", 1) - call ok(Err.number = 13, "Err.number = " & Err.number) - call Err.clear() - call Mid("test", "a", null) - call ok(Err.number = 94, "Err.number = " & Err.number) - call Err.clear() - call Mid("test", "a", empty) - call ok(Err.number = 13, "Err.number = " & Err.number) - call Mid("test", 0, -1) - call ok(Err.number = 5, "Err.number = " & Err.number) - call Err.clear() - call Mid("test", -1, -1) - call ok(Err.number = 5, "Err.number = " & Err.number) - call Err.clear() - call Mid(null, -1, -1) - call ok(Err.number = 5, "Err.number = " & Err.number) - call Err.clear() - call Mid("test", 0, null) - call ok(Err.number = 94, "Err.number = " & Err.number) - call Err.clear() - call Mid("test", -1, null) - call ok(Err.number = 94, "Err.number = " & Err.number) - call Err.clear() - call Mid("test", null, 2) - call ok(Err.number = 94, "Err.number = " & Err.number) - call Err.clear() - call Mid("test", null, -1) - call ok(Err.number = 94, "Err.number = " & Err.number) - call Err.clear() - call Mid(null, -1, -1) - call ok(Err.number = 5, "Err.number = " & Err.number) - call Err.clear() - call Mid("test", empty, 1) - call ok(Err.number = 5, "Err.number = " & Err.number) - call Err.clear() - call Mid("test", 0, empty) - call ok(Err.number = 5, "Err.number = " & Err.number) - call Err.clear() - call Mid(empty, 0, 0) - call ok(Err.number = 5, "Err.number = " & Err.number) -end sub -call TestMidError() +TestMidError "test", "a", 1, 13 +TestMidError "test", "a", null, 94 +TestMidError "test", "a", empty, 13 +TestMidError "test", 0, 3, 5 +TestMidError "test", 0, -1, 5 +TestMidError "test", -1, -1, 5 +TestMidError "test", 0, null, 94 +TestMidError "test", -1, null, 94 +TestMidError "test", null, 2, 94 +TestMidError "test", null, -1, 94 +TestMidError null, -1, -1, 5 +TestMidError "test", empty, 1, 5 +TestMidError "test", 0, empty, 5 +TestMidError empty, 0, 0, 5 Sub TestUCase(str, ex) x = UCase(str) -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/7070
From: Francis De Brabandere <francisdb(a)gmail.com> --- dlls/vbscript/global.c | 11 +++++++---- dlls/vbscript/tests/api.vbs | 15 +++++++++++++++ 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/dlls/vbscript/global.c b/dlls/vbscript/global.c index 058ddabcde1..972d0d2ea0b 100644 --- a/dlls/vbscript/global.c +++ b/dlls/vbscript/global.c @@ -1404,9 +1404,6 @@ static HRESULT Global_Mid(BuiltinDisp *This, VARIANT *args, unsigned args_cnt, V assert(args_cnt == 2 || args_cnt == 3); - if(V_VT(args) == VT_EMPTY) - return MAKE_VBSERROR(VBSE_ILLEGAL_FUNC_CALL); - if(V_VT(args+1) == VT_NULL || (args_cnt == 3 && V_VT(args+2) == VT_NULL)) return MAKE_VBSERROR(VBSE_ILLEGAL_NULL_USE); @@ -1417,7 +1414,7 @@ static HRESULT Global_Mid(BuiltinDisp *This, VARIANT *args, unsigned args_cnt, V if(FAILED(hres)) return hres; - if(start < 0) + if(start <= 0) return MAKE_VBSERROR(VBSE_ILLEGAL_FUNC_CALL); if(args_cnt == 3) { @@ -1432,6 +1429,12 @@ static HRESULT Global_Mid(BuiltinDisp *This, VARIANT *args, unsigned args_cnt, V return MAKE_VBSERROR(VBSE_ILLEGAL_FUNC_CALL); } + if(V_VT(args) == VT_EMPTY) + return return_string(res, L""); + + if(V_VT(args) == VT_NULL) + return return_null(res); + if(V_VT(args) == VT_BSTR) { str = V_BSTR(args); }else { diff --git a/dlls/vbscript/tests/api.vbs b/dlls/vbscript/tests/api.vbs index 296663d9c97..dfa2816bec5 100644 --- a/dlls/vbscript/tests/api.vbs +++ b/dlls/vbscript/tests/api.vbs @@ -632,6 +632,16 @@ Sub TestMid2(str, start, ex) Call ok(x = ex, "Mid(" & str & ", " & start & ") = " & x & " expected " & ex) End Sub +Sub TestMidNull(str, start, len) + x = Mid(str, start, len) + Call ok(IsNull(x), "Mid(" & str & ", " & start & ", " & len & ") = " & x & " expected Null") +End Sub + +Sub TestMidNull2(str, start) + x = Mid(str, start) + Call ok(IsNull(x), "Mid(" & str & ", " & start & ") = " & x & " expected Null") +End Sub + Sub TestMidError(str, start, len, number) On Error Resume Next Call Mid(str, start, len) @@ -654,6 +664,11 @@ TestMid2 "test", 2, "est" TestMid2 "test", 4, "t" TestMid2 "test", 5, "" TestMid2 1234, 5, "" +TestMid empty, 5, 2, "" +TestMid2 empty, 5, "" + +TestMidNull null, 5, 2 +TestMidNull2 null, 5 TestMidError "test", "a", 1, 13 TestMidError "test", "a", null, 94 -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/7070
On Wed Jan 8 13:21:20 2025 +0000, Francis De Brabandere wrote:
@jacek Is there a place where compiler error tests can be added. Making sure that certain things throw compile errors instead of runtime errors? Yes, see `parse_script_wr` calls in `run.c`.
-- https://gitlab.winehq.org/wine/wine/-/merge_requests/7070#note_91642
participants (3)
-
Francis De Brabandere -
Francis De Brabandere (@francisdb) -
Jacek Caban (@jacek)