Gabriel Ivăncescu : jscript: Implement persistent named items.

Alexandre Julliard julliard at winehq.org
Thu Mar 26 16:27:26 CDT 2020


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

Author: Gabriel Ivăncescu <gabrielopcode at gmail.com>
Date:   Tue Mar 24 18:49:57 2020 +0200

jscript: Implement persistent named items.

Signed-off-by: Gabriel Ivăncescu <gabrielopcode at gmail.com>
Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/jscript/jscript.c | 44 ++++++++++++++++++++++++++++++++++++--------
 1 file changed, 36 insertions(+), 8 deletions(-)

diff --git a/dlls/jscript/jscript.c b/dlls/jscript/jscript.c
index d6fa7c9ea1..3fcaab0858 100644
--- a/dlls/jscript/jscript.c
+++ b/dlls/jscript/jscript.c
@@ -414,6 +414,15 @@ static void release_persistent_script_objs(JScript *This)
             release_named_item_script_obj(iter->named_item);
 }
 
+static void release_named_item_list(JScript *This)
+{
+    while(!list_empty(&This->ctx->named_items)) {
+        named_item_t *iter = LIST_ENTRY(list_head(&This->ctx->named_items), named_item_t, entry);
+        list_remove(&iter->entry);
+        release_named_item(iter);
+    }
+}
+
 static void exec_queued_code(JScript *This)
 {
     bytecode_t *iter;
@@ -433,6 +442,8 @@ static void exec_queued_code(JScript *This)
 
 static void decrease_state(JScript *This, SCRIPTSTATE state)
 {
+    named_item_t *item, *item_next;
+
     if(This->ctx) {
         switch(This->ctx->state) {
         case SCRIPTSTATE_CONNECTED:
@@ -453,14 +464,19 @@ static void decrease_state(JScript *This, SCRIPTSTATE state)
             clear_script_queue(This);
             release_persistent_script_objs(This);
 
-            while(!list_empty(&This->ctx->named_items)) {
-                named_item_t *iter = LIST_ENTRY(list_head(&This->ctx->named_items), named_item_t, entry);
-
-                list_remove(&iter->entry);
-                if(iter->disp)
-                    IDispatch_Release(iter->disp);
-                release_named_item_script_obj(iter);
-                release_named_item(iter);
+            LIST_FOR_EACH_ENTRY_SAFE(item, item_next, &This->ctx->named_items, named_item_t, entry)
+            {
+                if(item->disp)
+                {
+                    IDispatch_Release(item->disp);
+                    item->disp = NULL;
+                }
+                release_named_item_script_obj(item);
+                if(!(item->flags & SCRIPTITEM_ISPERSISTENT))
+                {
+                    list_remove(&item->entry);
+                    release_named_item(item);
+                }
             }
 
             if(This->ctx->secmgr) {
@@ -688,6 +704,7 @@ static HRESULT WINAPI JScript_SetScriptSite(IActiveScript *iface,
                                             IActiveScriptSite *pass)
 {
     JScript *This = impl_from_IActiveScript(iface);
+    named_item_t *item;
     LCID lcid;
     HRESULT hres;
 
@@ -732,6 +749,16 @@ static HRESULT WINAPI JScript_SetScriptSite(IActiveScript *iface,
         }
     }
 
+    /* Retrieve new dispatches for persistent named items */
+    LIST_FOR_EACH_ENTRY(item, &This->ctx->named_items, named_item_t, entry)
+    {
+        if(!item->disp)
+        {
+            hres = retrieve_named_item_disp(pass, item);
+            if(FAILED(hres)) return hres;
+        }
+    }
+
     This->site = pass;
     IActiveScriptSite_AddRef(This->site);
 
@@ -829,6 +856,7 @@ static HRESULT WINAPI JScript_Close(IActiveScript *iface)
 
     decrease_state(This, SCRIPTSTATE_CLOSED);
     clear_persistent_code_list(This);
+    release_named_item_list(This);
     return S_OK;
 }
 




More information about the wine-cvs mailing list