Gabriel Ivăncescu : vbscript: Implement persistent named items.
Alexandre Julliard
julliard at winehq.org
Fri Mar 20 17:08:20 CDT 2020
Module: wine
Branch: master
Commit: 4b92d1943a645e3518a3b66012a1c57ae56e75d1
URL: https://source.winehq.org/git/wine.git/?a=commit;h=4b92d1943a645e3518a3b66012a1c57ae56e75d1
Author: Gabriel Ivăncescu <gabrielopcode at gmail.com>
Date: Thu Mar 19 19:20:16 2020 +0200
vbscript: 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/vbscript/vbscript.c | 46 +++++++++++++++++++++++++++++++++++++---------
1 file changed, 37 insertions(+), 9 deletions(-)
diff --git a/dlls/vbscript/vbscript.c b/dlls/vbscript/vbscript.c
index 52bc4ffd0d..858cacb7c3 100644
--- a/dlls/vbscript/vbscript.c
+++ b/dlls/vbscript/vbscript.c
@@ -262,6 +262,7 @@ void release_named_item(named_item_t *item)
static void release_script(script_ctx_t *ctx)
{
+ named_item_t *item, *item_next;
vbscode_t *code, *code_next;
collect_objects(ctx);
@@ -282,14 +283,19 @@ static void release_script(script_ctx_t *ctx)
}
}
- while(!list_empty(&ctx->named_items)) {
- named_item_t *iter = LIST_ENTRY(list_head(&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, &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(ctx->secmgr) {
@@ -321,6 +327,15 @@ static void release_code_list(script_ctx_t *ctx)
}
}
+static void release_named_item_list(script_ctx_t *ctx)
+{
+ while(!list_empty(&ctx->named_items)) {
+ named_item_t *iter = LIST_ENTRY(list_head(&ctx->named_items), named_item_t, entry);
+ list_remove(&iter->entry);
+ release_named_item(iter);
+ }
+}
+
static void decrease_state(VBScript *This, SCRIPTSTATE state)
{
switch(This->state) {
@@ -340,8 +355,10 @@ static void decrease_state(VBScript *This, SCRIPTSTATE state)
break;
release_script(This->ctx);
This->thread_id = 0;
- if(state == SCRIPTSTATE_CLOSED)
+ if(state == SCRIPTSTATE_CLOSED) {
release_code_list(This->ctx);
+ release_named_item_list(This->ctx);
+ }
break;
case SCRIPTSTATE_CLOSED:
break;
@@ -539,6 +556,7 @@ static ULONG WINAPI VBScript_Release(IActiveScript *iface)
static HRESULT WINAPI VBScript_SetScriptSite(IActiveScript *iface, IActiveScriptSite *pass)
{
VBScript *This = impl_from_IActiveScript(iface);
+ named_item_t *item;
LCID lcid;
HRESULT hres;
@@ -553,6 +571,16 @@ static HRESULT WINAPI VBScript_SetScriptSite(IActiveScript *iface, IActiveScript
if(InterlockedCompareExchange(&This->thread_id, GetCurrentThreadId(), 0))
return E_UNEXPECTED;
+ /* 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;
+ }
+ }
+
hres = create_script_disp(This->ctx, &This->ctx->script_obj);
if(FAILED(hres))
return hres;
More information about the wine-cvs
mailing list