[PATCH 0/1] MR10454: vbscript: Return DISP_E_TYPEMISMATCH when indexing non-array variables.
Indexing or assigning to a non-array, non-dispatch variable (e.g. Integer, String, Boolean, Empty, Null, Double, Date) with variant_call() returned E_NOTIMPL. Windows returns DISP_E_TYPEMISMATCH (error 13). -- https://gitlab.winehq.org/wine/wine/-/merge_requests/10454
From: Francis De Brabandere <francisdb@gmail.com> Indexing or assigning to a non-array, non-dispatch variable (e.g. Integer, String, Boolean, Empty, Null, Double, Date) with variant_call() returned E_NOTIMPL. Windows returns DISP_E_TYPEMISMATCH (error 13). --- dlls/vbscript/interp.c | 4 +- dlls/vbscript/tests/error.vbs | 10 +--- dlls/vbscript/tests/lang.vbs | 91 +++++++++++++++++++++++++++++++++++ 3 files changed, 94 insertions(+), 11 deletions(-) diff --git a/dlls/vbscript/interp.c b/dlls/vbscript/interp.c index 00ef7d93eb6..687711f0171 100644 --- a/dlls/vbscript/interp.c +++ b/dlls/vbscript/interp.c @@ -585,8 +585,8 @@ static HRESULT variant_call(exec_ctx_t *ctx, VARIANT *v, unsigned arg_cnt, VARIA hres = disp_call(ctx->script, V_DISPATCH(v), DISPID_VALUE, &dp, res); break; default: - FIXME("unsupported on %s\n", debugstr_variant(v)); - return E_NOTIMPL; + WARN("unsupported on %s\n", debugstr_variant(v)); + return DISP_E_TYPEMISMATCH; } if(array) { diff --git a/dlls/vbscript/tests/error.vbs b/dlls/vbscript/tests/error.vbs index a9d4dc9c0be..01e735cca12 100644 --- a/dlls/vbscript/tests/error.vbs +++ b/dlls/vbscript/tests/error.vbs @@ -487,21 +487,13 @@ ok err.number = &hdeadbeef&, "err.number = " & hex(err.number) ok err.description = "test", "err.description = " & err.description ok err.helpcontext = 10, "err.helpcontext = " & err.helpcontext ok err.helpfile = "test.chm", "err.helpfile = " & err.helpfile +err.clear throwWithDesc = 1 ok err.number = &hdeadbeef&, "err.number = " & hex(err.number) ok err.description = "test", "err.description = " & err.description ok err.helpcontext = 10, "err.helpcontext = " & err.helpcontext ok err.helpfile = "test.chm", "err.helpfile = " & err.helpfile - -on error goto 0 - -' indexed assign to non-array variable should give type mismatch -dim z -z = 42 -on error resume next -z(0) = 1 -ok err.number = 13, "err.number = " & err.number err.clear ' Option Explicit: assigning to undeclared variable should give error 500 diff --git a/dlls/vbscript/tests/lang.vbs b/dlls/vbscript/tests/lang.vbs index e0feba54b7e..8beee51e69f 100644 --- a/dlls/vbscript/tests/lang.vbs +++ b/dlls/vbscript/tests/lang.vbs @@ -2022,6 +2022,97 @@ for each x in noarr Call ok(false, "Empty array contains: " & x) next +' Indexing non-array variables should give type mismatch (error 13) +sub test_index_non_array + dim tmp + on error resume next + + ' indexed assign + x = 42 + err.clear + x(0) = 1 + call ok(err.number = 13, "assign int(0): err.number = " & err.number) + + x = "hello" + err.clear + x(0) = 1 + call ok(err.number = 13, "assign str(0): err.number = " & err.number) + + x = True + err.clear + x(0) = 1 + call ok(err.number = 13, "assign bool(0): err.number = " & err.number) + + x = Empty + err.clear + x(0) = 1 + call ok(err.number = 13, "assign empty(0): err.number = " & err.number) + + x = Null + err.clear + x(0) = 1 + call ok(err.number = 13, "assign null(0): err.number = " & err.number) + + x = 3.14 + err.clear + x(0) = 1 + call ok(err.number = 13, "assign double(0): err.number = " & err.number) + + x = Now + err.clear + x(0) = 1 + call ok(err.number = 13, "assign date(0): err.number = " & err.number) + + ' indexed read + x = 42 + err.clear + tmp = x(0) + call ok(err.number = 13, "read int(0): err.number = " & err.number) + + x = "hello" + err.clear + tmp = x(0) + call ok(err.number = 13, "read str(0): err.number = " & err.number) + + x = True + err.clear + tmp = x(0) + call ok(err.number = 13, "read bool(0): err.number = " & err.number) + + x = Empty + err.clear + tmp = x(0) + call ok(err.number = 13, "read empty(0): err.number = " & err.number) + + x = Null + err.clear + tmp = x(0) + call ok(err.number = 13, "read null(0): err.number = " & err.number) + + x = 3.14 + err.clear + tmp = x(0) + call ok(err.number = 13, "read double(0): err.number = " & err.number) + + x = Now + err.clear + tmp = x(0) + call ok(err.number = 13, "read date(0): err.number = " & err.number) + + ' multi-index on non-array + x = 42 + err.clear + tmp = x(0, 1) + call ok(err.number = 13, "read int(0,1): err.number = " & err.number) + + err.clear + x(0, 1) = 1 + call ok(err.number = 13, "assign int(0,1): err.number = " & err.number) + + on error goto 0 +end sub +call test_index_non_array + ' It's allowed to declare non-builtin RegExp class... class RegExp public property get Global() -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10454
participants (2)
-
Francis De Brabandere -
Francis De Brabandere (@francisdb)