From: Francis De Brabandere <francisdb@gmail.com> Native VBScript raises error 458 (VBSE_INVALID_TYPELIB_VARIABLE) when an expression involves a Variant whose type is one of VT_UI2/VT_UI4/ VT_UI8/VT_UINT, on both 32-bit and 64-bit. Add a script-level type gate at the entry of var_cmp so BSTR-vs-{UI2,UI4,UI8,UINT} comparisons match. --- dlls/vbscript/interp.c | 16 ++++++++++++++-- dlls/vbscript/tests/lang.vbs | 12 ++++++------ 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/dlls/vbscript/interp.c b/dlls/vbscript/interp.c index b4d82bbc7f6..7ff3baecce8 100644 --- a/dlls/vbscript/interp.c +++ b/dlls/vbscript/interp.c @@ -2111,8 +2111,17 @@ static inline BOOL is_numeric_vt(VARTYPE vt) { return vt == VT_I2 || vt == VT_I4 || vt == VT_R4 || vt == VT_R8 || vt == VT_CY || vt == VT_DATE || vt == VT_UI1 || vt == VT_DECIMAL - || vt == VT_I1 || vt == VT_I8 || vt == VT_UI2 || vt == VT_UI4 - || vt == VT_UI8 || vt == VT_INT || vt == VT_UINT; + || vt == VT_I1; +} + +/* Native VBScript rejects these Automation types with error 458 + * (VBSE_INVALID_TYPELIB_VARIABLE) when they appear in script expressions, + * on both 32-bit and 64-bit. VT_I8 is rejected on 32-bit native but + * accepted on 64-bit; not included here so BSTR-vs-I8 falls through to + * the default VarCmp path (BSTR > other), matching 64-bit native. */ +static inline BOOL is_unsupported_script_vt(VARTYPE vt) +{ + return vt == VT_UI2 || vt == VT_UI4 || vt == VT_UI8 || vt == VT_UINT; } /* CMP_LEFT_LITERAL / CMP_RIGHT_LITERAL are set by the compiler: each side is @@ -2128,6 +2137,9 @@ static HRESULT var_cmp(exec_ctx_t *ctx, VARIANT *l, VARIANT *r, unsigned flags) TRACE("%s %s\n", debugstr_variant(l), debugstr_variant(r)); + if(is_unsupported_script_vt(lvt) || is_unsupported_script_vt(rvt)) + return MAKE_VBSERROR(VBSE_INVALID_TYPELIB_VARIABLE); + /* BSTR vs numeric LITERAL: coerce BSTR to a number, parse failure raises * type-mismatch (error 13). */ if((lvt == VT_BSTR && is_numeric_vt(rvt) && r_lit) || diff --git a/dlls/vbscript/tests/lang.vbs b/dlls/vbscript/tests/lang.vbs index c665fada078..a77820e0629 100644 --- a/dlls/vbscript/tests/lang.vbs +++ b/dlls/vbscript/tests/lang.vbs @@ -243,12 +243,12 @@ 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, _ +Call 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. +' VT_UI8/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, _ +Call 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 @@ -261,15 +261,15 @@ 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, _ +Call 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, _ +Call 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, _ +Call ok(saved_err = 458, _ "BSTR = testobj.uintval should err 458, got " & saved_err) On Error Goto 0 -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10775