[PATCH v4 7/7] vbscript: Return the dispatch object directly in retval, rather than its value.

Gabriel Ivăncescu gabrielopcode at gmail.com
Fri Feb 7 07:55:56 CST 2020


Signed-off-by: Gabriel Ivăncescu <gabrielopcode at gmail.com>
---

This matches Windows behavior and allows us to test 'me' with named item
script dispatches too.

 dlls/vbscript/interp.c         |  4 +---
 dlls/vbscript/tests/run.c      | 13 +++++++++++++
 dlls/vbscript/tests/vbscript.c | 20 ++++++++++++++++++++
 3 files changed, 34 insertions(+), 3 deletions(-)

diff --git a/dlls/vbscript/interp.c b/dlls/vbscript/interp.c
index ff8949f..a30aab2 100644
--- a/dlls/vbscript/interp.c
+++ b/dlls/vbscript/interp.c
@@ -1494,9 +1494,7 @@ static HRESULT interp_retval(exec_ctx_t *ctx)
 
     TRACE("\n");
 
-    hres = stack_pop_val(ctx, &val);
-    if(FAILED(hres))
-        return hres;
+    stack_pop_deref(ctx, &val);
 
     if(val.owned) {
         VariantClear(&ctx->ret_val);
diff --git a/dlls/vbscript/tests/run.c b/dlls/vbscript/tests/run.c
index 8acf220..474fe1d 100644
--- a/dlls/vbscript/tests/run.c
+++ b/dlls/vbscript/tests/run.c
@@ -2685,6 +2685,7 @@ static void test_isexpression(void)
 {
     IActiveScriptParse *parser;
     IActiveScript *engine;
+    IDispatch *disp;
     SCRIPTSTATE ss;
     HRESULT hres;
     VARIANT var;
@@ -2747,6 +2748,18 @@ static void test_isexpression(void)
     VariantClear(&var);
     SysFreeString(str);
 
+    /* Without a global host or named item context, "me" returns the script dispatch */
+    hres = IActiveScript_GetScriptDispatch(engine, NULL, &disp);
+    ok(hres == S_OK, "GetScriptDispatch failed: %08x\n", hres);
+    str = a2bstr("me");
+    hres = IActiveScriptParse_ParseScriptText(parser, str, NULL, NULL, NULL, 0, 0, SCRIPTTEXT_ISEXPRESSION, &var, NULL);
+    ok(hres == S_OK, "ParseScriptText failed: %08x\n", hres);
+    ok(V_VT(&var) == VT_DISPATCH, "Expected VT_DISPATCH, got %s\n", vt2a(&var));
+    ok(V_DISPATCH(&var) == disp, "Wrong dispatch returned for 'me'\n");
+    IDispatch_Release(disp);
+    VariantClear(&var);
+    SysFreeString(str);
+
     /* An expression can also refer to a variable, function, class, etc previously set */
     V_VT(&var) = VT_I2;
     str = a2bstr("If True Then foo = 42 Else foo = 0\n");
diff --git a/dlls/vbscript/tests/vbscript.c b/dlls/vbscript/tests/vbscript.c
index 038ce47..4850c8e 100644
--- a/dlls/vbscript/tests/vbscript.c
+++ b/dlls/vbscript/tests/vbscript.c
@@ -1776,6 +1776,7 @@ static void test_named_items(void)
     IActiveScriptParse *parse;
     IActiveScript *script;
     IDispatch *disp;
+    VARIANT var;
     unsigned i;
     DISPID id;
     ULONG ref;
@@ -1972,6 +1973,25 @@ static void test_named_items(void)
     CHECK_CALLED(OnEnterScript);
     CHECK_CALLED(OnLeaveScript);
 
+    SET_EXPECT(OnEnterScript);
+    SET_EXPECT(OnLeaveScript);
+    hres = IActiveScriptParse_ParseScriptText(parse, L"me", NULL, NULL, NULL, 0, 0, SCRIPTTEXT_ISEXPRESSION, &var, NULL);
+    ok(hres == S_OK, "ParseScriptText failed: %08x\n", hres);
+    ok(V_VT(&var) == VT_DISPATCH && V_DISPATCH(&var) == &global_named_item,
+        "Unexpected 'me': V_VT = %d, V_DISPATCH = %p\n", V_VT(&var), V_DISPATCH(&var));
+    VariantClear(&var);
+    CHECK_CALLED(OnEnterScript);
+    CHECK_CALLED(OnLeaveScript);
+    SET_EXPECT(OnEnterScript);
+    SET_EXPECT(OnLeaveScript);
+    hres = IActiveScriptParse_ParseScriptText(parse, L"me", L"code context", NULL, NULL, 0, 0, SCRIPTTEXT_ISEXPRESSION, &var, NULL);
+    ok(hres == S_OK, "ParseScriptText failed: %08x\n", hres);
+    ok(V_VT(&var) == VT_DISPATCH && V_DISPATCH(&var) == (IDispatch*)script_disp2,
+        "Unexpected 'me': V_VT = %d, V_DISPATCH = %p\n", V_VT(&var), V_DISPATCH(&var));
+    VariantClear(&var);
+    CHECK_CALLED(OnEnterScript);
+    CHECK_CALLED(OnLeaveScript);
+
     IDispatchEx_Release(script_disp2);
     IDispatchEx_Release(script_disp);
 
-- 
2.21.0




More information about the wine-devel mailing list