Module: wine Branch: master Commit: 2d419b7d7b2ec95e867063bf479f33f9205215c3 URL: https://source.winehq.org/git/wine.git/?a=commit;h=2d419b7d7b2ec95e867063bf4...
Author: Jacek Caban jacek@codeweavers.com Date: Mon Oct 28 18:41:05 2019 +0100
vbscript: Always pass arguments inside parentheses by value.
Signed-off-by: Jacek Caban jacek@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/vbscript/compile.c | 3 +++ dlls/vbscript/interp.c | 17 +++++++++++++++++ dlls/vbscript/tests/lang.vbs | 10 +++++----- dlls/vbscript/vbscript.h | 1 + 4 files changed, 26 insertions(+), 5 deletions(-)
diff --git a/dlls/vbscript/compile.c b/dlls/vbscript/compile.c index 5acf4c005a..2023261399 100644 --- a/dlls/vbscript/compile.c +++ b/dlls/vbscript/compile.c @@ -417,6 +417,9 @@ static HRESULT compile_args(compile_ctx_t *ctx, expression_t *args, unsigned *re if(FAILED(hres)) return hres;
+ if(args->type == EXPR_BRACKETS && !push_instr(ctx, OP_deref)) + return E_OUTOFMEMORY; + arg_cnt++; args = args->next; } diff --git a/dlls/vbscript/interp.c b/dlls/vbscript/interp.c index 11a2a77d82..60c4340d6e 100644 --- a/dlls/vbscript/interp.c +++ b/dlls/vbscript/interp.c @@ -1028,6 +1028,23 @@ static HRESULT interp_pop(exec_ctx_t *ctx) return S_OK; }
+static HRESULT interp_deref(exec_ctx_t *ctx) +{ + VARIANT copy, *v = stack_top(ctx, 0); + HRESULT hres; + + TRACE("%s\n", debugstr_variant(v)); + + if(V_VT(v) != (VT_BYREF|VT_VARIANT)) + return S_OK; + + V_VT(©) = VT_EMPTY; + hres = VariantCopy(©, V_VARIANTREF(v)); + if(SUCCEEDED(hres)) + *v = copy; + return hres; +} + static HRESULT interp_new(exec_ctx_t *ctx) { const WCHAR *arg = ctx->instr->arg1.bstr; diff --git a/dlls/vbscript/tests/lang.vbs b/dlls/vbscript/tests/lang.vbs index 09c6b4f0ff..8027264bf5 100644 --- a/dlls/vbscript/tests/lang.vbs +++ b/dlls/vbscript/tests/lang.vbs @@ -1277,11 +1277,11 @@ ok x(0) = 2, "x(0) = " & x(0)
x = Array(1) seta0 (x) -todo_wine_ok x(0) = 1, "x(0) = " & x(0) +ok x(0) = 1, "x(0) = " & x(0)
x = Array(1) call (((seta0))) ((x)) -todo_wine_ok x(0) = 1, "x(0) = " & x(0) +ok x(0) = 1, "x(0) = " & x(0)
x = Array(1) call (((seta0))) (x) @@ -1293,7 +1293,7 @@ call ok(x(0)(0) = 2, "x(0)(0) = " & x(0)(0))
x = Array(Array(3)) seta0 (x(0)) -call todo_wine_ok(x(0)(0) = 3, "x(0)(0) = " & x(0)(0)) +call ok(x(0)(0) = 3, "x(0)(0) = " & x(0)(0))
y = (seta0)(x) ok y = 1, "y = " & y @@ -1311,7 +1311,7 @@ ok x(0) = 2, "x(0) = " & x(0)
x = Array(1) changearg (x(0)) -todo_wine_ok x(0) = 1, "x(0) = " & x(0) +ok x(0) = 1, "x(0) = " & x(0)
Class ArrClass Dim classarr(3) @@ -1377,7 +1377,7 @@ Call ok(arr(0) = "modified", "arr(0) = " & arr(0))
arr(0) = "not modified" modifyarr(arr) -Call todo_wine_ok(arr(0) = "not modified", "arr(0) = " & arr(0)) +Call ok(arr(0) = "not modified", "arr(0) = " & arr(0))
for x = 0 to UBound(arr) arr(x) = x diff --git a/dlls/vbscript/vbscript.h b/dlls/vbscript/vbscript.h index 0382a80290..33eb1e8305 100644 --- a/dlls/vbscript/vbscript.h +++ b/dlls/vbscript/vbscript.h @@ -224,6 +224,7 @@ typedef enum { X(case, 0, ARG_ADDR, 0) \ X(concat, 1, 0, 0) \ X(const, 1, ARG_BSTR, 0) \ + X(deref, 1, 0, 0) \ X(dim, 1, ARG_BSTR, ARG_UINT) \ X(div, 1, 0, 0) \ X(double, 1, ARG_DOUBLE, 0) \