[PATCH 0/1] MR10483: vbscript: Return "Illegal assignment" error for Const and function assignment.
Assigning to a Const variable or a function/sub name should return error 501 (Illegal assignment), not 445 (Object doesn't support this action). Change the REF_CONST and REF_FUNC cases in assign_ident() to use MAKE_VBSERROR(VBSE_ILLEGAL_ASSIGNMENT). -- https://gitlab.winehq.org/wine/wine/-/merge_requests/10483
From: Francis De Brabandere <francisdb@gmail.com> --- dlls/vbscript/interp.c | 8 ++++---- dlls/vbscript/tests/lang.vbs | 31 +++++++++++++++++++++++++++++++ dlls/vbscript/vbscript.rc | 1 + dlls/vbscript/vbscript_defs.h | 1 + 4 files changed, 37 insertions(+), 4 deletions(-) diff --git a/dlls/vbscript/interp.c b/dlls/vbscript/interp.c index d8f0f80dfaa..8f01458f172 100644 --- a/dlls/vbscript/interp.c +++ b/dlls/vbscript/interp.c @@ -918,14 +918,14 @@ static HRESULT assign_ident(exec_ctx_t *ctx, BSTR name, WORD flags, DISPPARAMS * hres = disp_propput(ctx->script, ref.u.d.disp, ref.u.d.id, flags, dp); break; case REF_FUNC: - FIXME("functions not implemented\n"); - return E_NOTIMPL; + WARN("assign to function %s\n", debugstr_w(name)); + return MAKE_VBSERROR(VBSE_ILLEGAL_ASSIGNMENT); case REF_OBJ: FIXME("REF_OBJ\n"); return E_NOTIMPL; case REF_CONST: - FIXME("REF_CONST\n"); - return E_NOTIMPL; + WARN("assign to const %s\n", debugstr_w(name)); + return MAKE_VBSERROR(VBSE_ILLEGAL_ASSIGNMENT); case REF_NONE: if(ctx->func->code_ctx->option_explicit) { FIXME("throw exception\n"); diff --git a/dlls/vbscript/tests/lang.vbs b/dlls/vbscript/tests/lang.vbs index c0d22606ba6..e9f49fba16c 100644 --- a/dlls/vbscript/tests/lang.vbs +++ b/dlls/vbscript/tests/lang.vbs @@ -1173,6 +1173,37 @@ Sub TestDimVsConst End Sub Call TestDimVsConst +Sub TestIllegalAssignment + on error resume next + + ' Assign to Const should give error 501 + err.clear + c10 = 99 + Call ok(err.number = 501, "assign to const: err.number = " & err.number) + Call ok(c10 = 10, "c10 = " & c10) + + ' Set on Const should give error 501 + err.clear + set c10 = Nothing + Call ok(err.number = 501, "set const: err.number = " & err.number) + + ' Assign to Sub name should give error 501 + err.clear + TestIllegalAssignment = 10 + Call ok(err.number = 501, "assign to sub name: err.number = " & err.number) +End Sub +Call TestIllegalAssignment + +' Assign to function name from outside should give error 501 +Function IllegalAssignTarget + IllegalAssignTarget = 0 +End Function +on error resume next +err.clear +IllegalAssignTarget = 10 +Call ok(err.number = 501, "assign to func name: err.number = " & err.number) +on error goto 0 + Function TestFuncMultiArgs(a,b,c,d,e) Call ok(a=1, "a = " & a) Call ok(b=2, "b = " & b) diff --git a/dlls/vbscript/vbscript.rc b/dlls/vbscript/vbscript.rc index a0f7381bcf0..125d915ffff 100644 --- a/dlls/vbscript/vbscript.rc +++ b/dlls/vbscript/vbscript.rc @@ -58,6 +58,7 @@ STRINGTABLE VBSE_INVALID_DLL_FUNCTION_NAME "Specified DLL function not found" VBSE_INVALID_TYPELIB_VARIABLE "Variable uses an Automation type not supported in VBScript" VBSE_SERVER_NOT_FOUND "The remote server machine does not exist or is unavailable" + VBSE_ILLEGAL_ASSIGNMENT "Illegal assignment" VBSE_UNQUALIFIED_REFERENCE "Invalid or unqualified reference" VBSE_SYNTAX_ERROR "Syntax error" VBSE_EXPECTED_LPAREN "Expected '('" diff --git a/dlls/vbscript/vbscript_defs.h b/dlls/vbscript/vbscript_defs.h index 06d3b8990fb..672e9e18349 100644 --- a/dlls/vbscript/vbscript_defs.h +++ b/dlls/vbscript/vbscript_defs.h @@ -269,6 +269,7 @@ #define VBSE_INVALID_DLL_FUNCTION_NAME 453 #define VBSE_INVALID_TYPELIB_VARIABLE 458 #define VBSE_SERVER_NOT_FOUND 462 +#define VBSE_ILLEGAL_ASSIGNMENT 501 #define VBSE_UNQUALIFIED_REFERENCE 505 #define VBSE_SYNTAX_ERROR 1002 #define VBSE_EXPECTED_LPAREN 1005 -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10483
participants (2)
-
Francis De Brabandere -
Francis De Brabandere (@francisdb)