Jacek Caban : msscript.ocx: Move modules_count to the Script Host.

Alexandre Julliard julliard at winehq.org
Tue Jun 23 15:52:53 CDT 2020


Module: wine
Branch: master
Commit: 5a6ac3aac11a6f88d0bc1c30fb791d5dbe1131ed
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=5a6ac3aac11a6f88d0bc1c30fb791d5dbe1131ed

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Tue Jun 23 16:40:49 2020 +0200

msscript.ocx: Move modules_count to the Script Host.

Based on patch by Gabriel Ivăncescu.

Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/msscript.ocx/msscript.c       | 40 +++++++++++++++++++-------------------
 dlls/msscript.ocx/tests/msscript.c |  9 +++++++++
 2 files changed, 29 insertions(+), 20 deletions(-)

diff --git a/dlls/msscript.ocx/msscript.c b/dlls/msscript.ocx/msscript.c
index 8fb127e0e3..f7917b2327 100644
--- a/dlls/msscript.ocx/msscript.c
+++ b/dlls/msscript.ocx/msscript.c
@@ -82,6 +82,8 @@ typedef struct ScriptHost {
     SCRIPTSTATE script_state;
     CLSID clsid;
 
+    unsigned int module_count;
+
     struct list named_items;
 } ScriptHost;
 
@@ -111,7 +113,6 @@ struct ScriptControl {
     DWORD view_sink_flags;
 
     /* modules */
-    unsigned int module_count;
     ScriptModule **modules;
     IScriptModuleCollection IScriptModuleCollection_iface;
 
@@ -770,10 +771,9 @@ static void release_modules(ScriptControl *control)
 {
     unsigned int i;
 
-    for (i = 0; i < control->module_count; i++)
+    for (i = 0; i < control->host->module_count; i++)
         IScriptModule_Release(&control->modules[i]->IScriptModule_iface);
 
-    control->module_count = 0;
     heap_free(control->modules);
 }
 
@@ -896,8 +896,9 @@ static HRESULT WINAPI ScriptModuleCollection_get_Count(IScriptModuleCollection *
     TRACE("(%p)->(%p)\n", This, plCount);
 
     if (!plCount) return E_POINTER;
+    if (!This->host) return E_FAIL;
 
-    *plCount = This->module_count;
+    *plCount = This->host->module_count;
     return S_OK;
 }
 
@@ -945,6 +946,7 @@ static HRESULT init_script_host(const CLSID *clsid, ScriptHost **ret)
     host->parse = NULL;
     host->script_dispatch = NULL;
     host->clsid = *clsid;
+    host->module_count = 1;
     list_init(&host->named_items);
 
     hr = CoCreateInstance(&host->clsid, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER,
@@ -1068,8 +1070,10 @@ static ULONG WINAPI ScriptControl_Release(IScriptControl *iface)
         if (This->site)
             IOleClientSite_Release(This->site);
         if (This->host)
+        {
+            release_modules(This);
             release_script_engine(This->host);
-        release_modules(This);
+        }
         heap_free(This);
     }
 
@@ -1159,7 +1163,6 @@ static HRESULT WINAPI ScriptControl_get_Language(IScriptControl *iface, BSTR *p)
 static HRESULT WINAPI ScriptControl_put_Language(IScriptControl *iface, BSTR language)
 {
     ScriptControl *This = impl_from_IScriptControl(iface);
-    ScriptModule **modules;
     CLSID clsid;
 
     TRACE("(%p)->(%s)\n", This, debugstr_w(language));
@@ -1167,24 +1170,21 @@ static HRESULT WINAPI ScriptControl_put_Language(IScriptControl *iface, BSTR lan
     if (language && FAILED(CLSIDFromProgID(language, &clsid)))
         return CTL_E_INVALIDPROPERTYVALUE;
 
-    /* Alloc new global module */
-    modules = heap_alloc_zero(sizeof(*modules));
-    if (!modules) return E_OUTOFMEMORY;
-
-    modules[0] = create_module();
-    if (!modules[0]) {
-        heap_free(modules);
-        return E_OUTOFMEMORY;
-    }
-
     if (This->host) {
         release_script_engine(This->host);
         This->host = NULL;
     }
 
-    release_modules(This);
-    This->modules = modules;
-    This->module_count = 1;
+    /* Alloc global module */
+    This->modules = heap_alloc_zero(sizeof(*This->modules));
+    if (!This->modules) return E_OUTOFMEMORY;
+
+    This->modules[0] = create_module();
+    if (!This->modules[0]) {
+        heap_free(This->modules);
+        This->modules = NULL;
+        return E_OUTOFMEMORY;
+    }
 
     if (!language)
         return S_OK;
@@ -1332,7 +1332,7 @@ static HRESULT WINAPI ScriptControl_get_Modules(IScriptControl *iface, IScriptMo
 
     TRACE("(%p)->(%p)\n", This, p);
 
-    if (!This->module_count) return E_FAIL;
+    if (!This->host) return E_FAIL;
 
     *p = &This->IScriptModuleCollection_iface;
     IScriptControl_AddRef(iface);
diff --git a/dlls/msscript.ocx/tests/msscript.c b/dlls/msscript.ocx/tests/msscript.c
index fbbe83191b..b6a5209fa1 100644
--- a/dlls/msscript.ocx/tests/msscript.c
+++ b/dlls/msscript.ocx/tests/msscript.c
@@ -2414,7 +2414,16 @@ static void test_IScriptControl_get_Modules(void)
     ok(hr == S_OK, "IScriptModuleCollection_get_Count failed: 0x%08x.\n", hr);
     ok(count == 1, "count is not 1, got %d.\n", count);
 
+    hr = IScriptControl_put_Language(sc, NULL);
+    ok(hr == S_OK, "IScriptControl_put_Language failed: 0x%08x.\n", hr);
+
+    hr = IScriptModuleCollection_get_Count(mods, &count);
+    ok(hr == E_FAIL, "IScriptModuleCollection_get_Count returned: 0x%08x.\n", hr);
+
     IScriptModuleCollection_Release(mods);
+    hr = IScriptControl_get_Modules(sc, &mods);
+    ok(hr == E_FAIL, "IScriptControl_get_Modules returned: 0x%08x.\n", hr);
+
     IScriptControl_Release(sc);
 
     /* custom script engine */




More information about the wine-cvs mailing list