[PATCH v4 4/7] vbscript: Implement the SCRIPTITEM_CODEONLY flag.

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


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

The tests that are added as part of testing the named item script dispatches
are sufficient to cover the remaining cases, otherwise many calls fail both
on Windows and Wine (we already have ok(0, ...) tests for those, it's not
really necessary to add more tests for the same thing, in my opinion).

 dlls/vbscript/compile.c        |  2 +-
 dlls/vbscript/interp.c         |  2 +-
 dlls/vbscript/tests/vbscript.c | 56 +++++++++++++++++++++++++++++++++-
 dlls/vbscript/vbscript.c       |  4 +--
 dlls/vbscript/vbscript.h       |  2 +-
 5 files changed, 60 insertions(+), 6 deletions(-)

diff --git a/dlls/vbscript/compile.c b/dlls/vbscript/compile.c
index 9888109..cd33641 100644
--- a/dlls/vbscript/compile.c
+++ b/dlls/vbscript/compile.c
@@ -1933,7 +1933,7 @@ HRESULT compile_script(script_ctx_t *script, const WCHAR *src, const WCHAR *item
     HRESULT hres;
 
     if(item_name) {
-        item = lookup_named_item(script, item_name, 0);
+        item = lookup_named_item(script, item_name, 0, SCRIPTITEM_CODEONLY);
         if(!item) {
             WARN("Unknown context %s\n", debugstr_w(item_name));
             return E_INVALIDARG;
diff --git a/dlls/vbscript/interp.c b/dlls/vbscript/interp.c
index f0820be..adffc25 100644
--- a/dlls/vbscript/interp.c
+++ b/dlls/vbscript/interp.c
@@ -204,7 +204,7 @@ static HRESULT lookup_identifier(exec_ctx_t *ctx, BSTR name, vbdisp_invoke_type_
         return S_OK;
     }
 
-    item = lookup_named_item(ctx->script, name, SCRIPTITEM_ISVISIBLE);
+    item = lookup_named_item(ctx->script, name, SCRIPTITEM_ISVISIBLE, 0);
     if(item && item->disp) {
         ref->type = REF_OBJ;
         ref->u.obj = item->disp;
diff --git a/dlls/vbscript/tests/vbscript.c b/dlls/vbscript/tests/vbscript.c
index 10af993..4e44758 100644
--- a/dlls/vbscript/tests/vbscript.c
+++ b/dlls/vbscript/tests/vbscript.c
@@ -97,6 +97,7 @@ DEFINE_EXPECT(OnEnterScript);
 DEFINE_EXPECT(OnLeaveScript);
 DEFINE_EXPECT(GetItemInfo_global);
 DEFINE_EXPECT(GetItemInfo_visible);
+DEFINE_EXPECT(GetItemInfo_visible_code);
 DEFINE_EXPECT(testCall);
 
 DEFINE_GUID(CLSID_VBScript, 0xb54f3741, 0x5b07, 0x11cf, 0xa4,0xb0, 0x00,0xaa,0x00,0x4a,0x55,0xe8);
@@ -137,7 +138,7 @@ static HRESULT WINAPI Dispatch_QueryInterface(IDispatch *iface, REFIID riid, voi
     return E_NOINTERFACE;
 }
 
-static ULONG global_named_item_ref, visible_named_item_ref;
+static ULONG global_named_item_ref, visible_named_item_ref, visible_code_named_item_ref;
 
 static ULONG WINAPI global_AddRef(IDispatch *iface)
 {
@@ -159,6 +160,16 @@ static ULONG WINAPI visible_Release(IDispatch *iface)
     return --visible_named_item_ref;
 }
 
+static ULONG WINAPI visible_code_AddRef(IDispatch *iface)
+{
+    return ++visible_code_named_item_ref;
+}
+
+static ULONG WINAPI visible_code_Release(IDispatch *iface)
+{
+    return --visible_code_named_item_ref;
+}
+
 static HRESULT WINAPI Dispatch_GetTypeInfoCount(IDispatch *iface, UINT *pctinfo)
 {
     ok(0, "unexpected call\n");
@@ -214,6 +225,18 @@ static const IDispatchVtbl visible_named_item_vtbl = {
 
 static IDispatch visible_named_item = { &visible_named_item_vtbl };
 
+static const IDispatchVtbl visible_code_named_item_vtbl = {
+    Dispatch_QueryInterface,
+    visible_code_AddRef,
+    visible_code_Release,
+    Dispatch_GetTypeInfoCount,
+    Dispatch_GetTypeInfo,
+    Dispatch_GetIDsOfNames,
+    Dispatch_Invoke
+};
+
+static IDispatch visible_code_named_item = { &visible_code_named_item_vtbl };
+
 static HRESULT WINAPI ActiveScriptSite_QueryInterface(IActiveScriptSite *iface, REFIID riid, void **ppv)
 {
     *ppv = NULL;
@@ -261,6 +284,12 @@ static HRESULT WINAPI ActiveScriptSite_GetItemInfo(IActiveScriptSite *iface, LPC
         *item_unk = (IUnknown*)&visible_named_item;
         return S_OK;
     }
+    if(!wcscmp(name, L"visibleCodeItem")) {
+        CHECK_EXPECT(GetItemInfo_visible_code);
+        IDispatch_AddRef(&visible_code_named_item);
+        *item_unk = (IUnknown*)&visible_code_named_item;
+        return S_OK;
+    }
     ok(0, "unexpected call %s\n", wine_dbgstr_w(name));
     return E_NOTIMPL;
 }
@@ -1704,6 +1733,7 @@ static void test_named_items(void)
 {
     IActiveScriptParse *parse;
     IActiveScript *script;
+    IDispatch *disp;
     ULONG ref;
     HRESULT hres;
 
@@ -1731,9 +1761,12 @@ static void test_named_items(void)
 
     hres = IActiveScript_AddNamedItem(script, L"visibleItem", SCRIPTITEM_ISVISIBLE);
     ok(hres == S_OK, "AddNamedItem failed: %08x\n", hres);
+    hres = IActiveScript_AddNamedItem(script, L"visibleCodeItem", SCRIPTITEM_ISVISIBLE | SCRIPTITEM_CODEONLY);
+    ok(hres == S_OK, "AddNamedItem failed: %08x\n", hres);
 
     ok(global_named_item_ref > 0, "global_named_item_ref = %u\n", global_named_item_ref);
     ok(visible_named_item_ref == 0, "visible_named_item_ref = %u\n", visible_named_item_ref);
+    ok(visible_code_named_item_ref == 0, "visible_code_named_item_ref = %u\n", visible_code_named_item_ref);
 
     SET_EXPECT(OnStateChange_INITIALIZED);
     hres = IActiveScriptParse_InitNew(parse);
@@ -1755,8 +1788,28 @@ static void test_named_items(void)
     CHECK_CALLED(GetItemInfo_visible);
     CHECK_CALLED(testCall);
 
+    SET_EXPECT(OnEnterScript);
+    SET_EXPECT(OnLeaveScript);
+    SET_EXPECT(testCall);
+    hres = IActiveScriptParse_ParseScriptText(parse, L"testCall\n", L"visibleCodeItem", NULL, NULL, 0, 0, 0, NULL, NULL);
+    ok(hres == S_OK, "ParseScriptText failed: %08x\n", hres);
+    CHECK_CALLED(OnEnterScript);
+    CHECK_CALLED(OnLeaveScript);
+    CHECK_CALLED(testCall);
+
+    hres = IActiveScript_GetScriptDispatch(script, L"visibleCodeItem", &disp);
+    ok(hres == S_OK, "GetScriptDispatch returned: %08x\n", hres);
+    IDispatch_Release(disp);
+
+    SET_EXPECT(GetItemInfo_visible_code);
+    SET_EXPECT(testCall);
+    parse_script(parse, "visibleCodeItem.testCall\n");
+    CHECK_CALLED(GetItemInfo_visible_code);
+    CHECK_CALLED(testCall);
+
     ok(global_named_item_ref > 0, "global_named_item_ref = %u\n", global_named_item_ref);
     ok(visible_named_item_ref == 1, "visible_named_item_ref = %u\n", visible_named_item_ref);
+    ok(visible_code_named_item_ref == 1, "visible_code_named_item_ref = %u\n", visible_code_named_item_ref);
 
     SET_EXPECT(testCall);
     parse_script(parse, "visibleItem.testCall\n");
@@ -1773,6 +1826,7 @@ static void test_named_items(void)
 
     ok(global_named_item_ref == 0, "global_named_item_ref = %u\n", global_named_item_ref);
     ok(visible_named_item_ref == 0, "visible_named_item_ref = %u\n", visible_named_item_ref);
+    ok(visible_code_named_item_ref == 0, "visible_code_named_item_ref = %u\n", visible_code_named_item_ref);
 
     test_state(script, SCRIPTSTATE_CLOSED);
 
diff --git a/dlls/vbscript/vbscript.c b/dlls/vbscript/vbscript.c
index 88574fe..3b80fe8 100644
--- a/dlls/vbscript/vbscript.c
+++ b/dlls/vbscript/vbscript.c
@@ -189,14 +189,14 @@ static void exec_queued_code(script_ctx_t *ctx)
     }
 }
 
-named_item_t *lookup_named_item(script_ctx_t *ctx, const WCHAR *name, unsigned flags)
+named_item_t *lookup_named_item(script_ctx_t *ctx, const WCHAR *name, unsigned flags, unsigned no_disp_flags)
 {
     named_item_t *item;
     HRESULT hres;
 
     LIST_FOR_EACH_ENTRY(item, &ctx->named_items, named_item_t, entry) {
         if((item->flags & flags) == flags && !wcsicmp(item->name, name)) {
-            if(!item->disp) {
+            if(!item->disp && !(item->flags & no_disp_flags)) {
                 IUnknown *unk;
 
                 hres = IActiveScriptSite_GetItemInfo(ctx->site, item->name,
diff --git a/dlls/vbscript/vbscript.h b/dlls/vbscript/vbscript.h
index 589abc3..941834c 100644
--- a/dlls/vbscript/vbscript.h
+++ b/dlls/vbscript/vbscript.h
@@ -372,7 +372,7 @@ HRESULT compile_script(script_ctx_t*,const WCHAR*,const WCHAR*,const WCHAR*,DWOR
 HRESULT compile_procedure(script_ctx_t*,const WCHAR*,const WCHAR*,const WCHAR*,DWORD_PTR,unsigned,DWORD,class_desc_t**) DECLSPEC_HIDDEN;
 HRESULT exec_script(script_ctx_t*,BOOL,function_t*,vbdisp_t*,DISPPARAMS*,VARIANT*) DECLSPEC_HIDDEN;
 void release_dynamic_var(dynamic_var_t*) DECLSPEC_HIDDEN;
-named_item_t *lookup_named_item(script_ctx_t*,const WCHAR*,unsigned) DECLSPEC_HIDDEN;
+named_item_t *lookup_named_item(script_ctx_t*,const WCHAR*,unsigned,unsigned) DECLSPEC_HIDDEN;
 void clear_ei(EXCEPINFO*) DECLSPEC_HIDDEN;
 HRESULT report_script_error(script_ctx_t*,const vbscode_t*,unsigned) DECLSPEC_HIDDEN;
 void detach_global_objects(script_ctx_t*) DECLSPEC_HIDDEN;
-- 
2.21.0




More information about the wine-devel mailing list