https://bugs.winehq.org/show_bug.cgi?id=55502
-- v2: vbscript: Sub argument has precedence over global const and local dim.
From: Robert Wilhelm robert.wilhelm@gmx.net
https://bugs.winehq.org/show_bug.cgi?id=55502 --- dlls/vbscript/compile.c | 57 ++++++++++++++++++------------------ dlls/vbscript/tests/lang.vbs | 13 ++++++++ 2 files changed, 42 insertions(+), 28 deletions(-)
diff --git a/dlls/vbscript/compile.c b/dlls/vbscript/compile.c index f86ecfded91..683c71e2f4e 100644 --- a/dlls/vbscript/compile.c +++ b/dlls/vbscript/compile.c @@ -425,6 +425,30 @@ static expression_t *lookup_const_decls(compile_ctx_t *ctx, const WCHAR *name, B return NULL; }
+static BOOL lookup_args_name(compile_ctx_t *ctx, const WCHAR *name) +{ + unsigned i; + + for(i = 0; i < ctx->func->arg_cnt; i++) { + if(!wcsicmp(ctx->func->args[i].name, name)) + return TRUE; + } + + return FALSE; +} + +static BOOL lookup_dim_decls(compile_ctx_t *ctx, const WCHAR *name) +{ + dim_decl_t *dim_decl; + + for(dim_decl = ctx->dim_decls; dim_decl; dim_decl = dim_decl->next) { + if(!wcsicmp(dim_decl->name, name)) + return TRUE; + } + + return FALSE; +} + static HRESULT compile_args(compile_ctx_t *ctx, expression_t *args, unsigned *ret) { unsigned arg_cnt = 0; @@ -479,10 +503,11 @@ static HRESULT compile_member_expression(compile_ctx_t *ctx, member_expression_t if (expr->obj_expr) /* FIXME: we should probably have a dedicated opcode as well */ return compile_member_call_expression(ctx, expr, 0, TRUE);
- const_expr = lookup_const_decls(ctx, expr->identifier, TRUE); - if(const_expr) - return compile_expression(ctx, const_expr); - + if (!lookup_dim_decls(ctx, expr->identifier) && !lookup_args_name(ctx, expr->identifier)) { + const_expr = lookup_const_decls(ctx, expr->identifier, TRUE); + if(const_expr) + return compile_expression(ctx, const_expr); + } return push_instr_bstr(ctx, OP_ident, expr->identifier); }
@@ -1104,30 +1129,6 @@ static HRESULT compile_call_statement(compile_ctx_t *ctx, call_statement_t *stat return S_OK; }
-static BOOL lookup_dim_decls(compile_ctx_t *ctx, const WCHAR *name) -{ - dim_decl_t *dim_decl; - - for(dim_decl = ctx->dim_decls; dim_decl; dim_decl = dim_decl->next) { - if(!wcsicmp(dim_decl->name, name)) - return TRUE; - } - - return FALSE; -} - -static BOOL lookup_args_name(compile_ctx_t *ctx, const WCHAR *name) -{ - unsigned i; - - for(i = 0; i < ctx->func->arg_cnt; i++) { - if(!wcsicmp(ctx->func->args[i].name, name)) - return TRUE; - } - - return FALSE; -} - static HRESULT compile_dim_statement(compile_ctx_t *ctx, dim_statement_t *stat) { dim_decl_t *dim_decl = stat->dim_decls; diff --git a/dlls/vbscript/tests/lang.vbs b/dlls/vbscript/tests/lang.vbs index 55efdcb5a00..3c437f7f15d 100644 --- a/dlls/vbscript/tests/lang.vbs +++ b/dlls/vbscript/tests/lang.vbs @@ -967,6 +967,19 @@ x = false Call TestFuncArgVal(x) Call ok(not x, "x is true after TestFuncArgVal call?")
+const c10 = 10 +Sub TestParamvsConst(c10) + Call ok( c10 = 42, "precedence between const and parameter wrong!") +End Sub +Call TestParamvsConst(42) + +Sub TestDimVsConst + dim c10 + c10 = 42 + Call ok( c10 = 42, "precedence between const and dim is wrong") +End Sub +Call TestDimVsConst + Function TestFuncMultiArgs(a,b,c,d,e) Call ok(a=1, "a = " & a) Call ok(b=2, "b = " & b)
On Thu Nov 30 21:04:09 2023 +0000, Robert Wilhelm wrote:
changed this line in [version 2 of the diff](/wine/wine/-/merge_requests/4548/diffs?diff_id=87092&start_sha=9a18332633d11e3dca8ceda16fb24b16e4b20c57#7e6a3bd1d6c51ede8f2a0fa46f76324e4c02a37e_494_506)
Thanks for the review. I have added your suggestions to version 2 of this MR.
This merge request was approved by Jacek Caban.