Jacek Caban : vbscript: Keep script context alive after Close call, but make it reusable.

Alexandre Julliard julliard at winehq.org
Fri Oct 14 14:14:49 CDT 2011


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Fri Oct 14 16:21:52 2011 +0200

vbscript: Keep script context alive after Close call, but make it reusable.

---

 dlls/vbscript/vbscript.c |   62 +++++++++++++++++++++++++++++++++------------
 1 files changed, 45 insertions(+), 17 deletions(-)

diff --git a/dlls/vbscript/vbscript.c b/dlls/vbscript/vbscript.c
index 7bea9f2b..ffaa63e 100644
--- a/dlls/vbscript/vbscript.c
+++ b/dlls/vbscript/vbscript.c
@@ -110,13 +110,10 @@ static HRESULT set_ctx_site(VBScript *This)
     return S_OK;
 }
 
-static void destroy_script(script_ctx_t *ctx)
+static void release_script(script_ctx_t *ctx)
 {
     collect_objects(ctx);
 
-    while(!list_empty(&ctx->code_list))
-        release_vbscode(LIST_ENTRY(list_head(&ctx->code_list), vbscode_t, entry));
-
     while(!list_empty(&ctx->named_items)) {
         named_item_t *iter = LIST_ENTRY(list_head(&ctx->named_items), named_item_t, entry);
 
@@ -127,19 +124,46 @@ static void destroy_script(script_ctx_t *ctx)
         heap_free(iter);
     }
 
-    if(ctx->host_global)
+    if(ctx->host_global) {
         IDispatch_Release(ctx->host_global);
-    if(ctx->secmgr)
+        ctx->host_global = NULL;
+    }
+
+    if(ctx->secmgr) {
         IInternetHostSecurityManager_Release(ctx->secmgr);
-    if(ctx->site)
+        ctx->secmgr = NULL;
+    }
+
+    if(ctx->site) {
         IActiveScriptSite_Release(ctx->site);
-    if(ctx->err_obj)
+        ctx->site = NULL;
+    }
+
+    if(ctx->err_obj) {
         IDispatchEx_Release(&ctx->err_obj->IDispatchEx_iface);
-    if(ctx->global_obj)
+        ctx->err_obj = NULL;
+    }
+
+    if(ctx->global_obj) {
         IDispatchEx_Release(&ctx->global_obj->IDispatchEx_iface);
-    if(ctx->script_obj)
+        ctx->global_obj = NULL;
+    }
+
+    if(ctx->script_obj) {
         IDispatchEx_Release(&ctx->script_obj->IDispatchEx_iface);
+        ctx->script_obj = NULL;
+    }
+
     vbsheap_free(&ctx->heap);
+    vbsheap_init(&ctx->heap);
+}
+
+static void destroy_script(script_ctx_t *ctx)
+{
+    while(!list_empty(&ctx->code_list))
+        release_vbscode(LIST_ENTRY(list_head(&ctx->code_list), vbscode_t, entry));
+
+    release_script(ctx);
     heap_free(ctx);
 }
 
@@ -167,13 +191,12 @@ static void decrease_state(VBScript *This, SCRIPTSTATE state)
             This->site = NULL;
         }
 
-        This->thread_id = 0;
-
-        if(state == SCRIPTSTATE_CLOSED) {
-            destroy_script(This->ctx);
-            This->ctx = NULL;
-        }
+        if(This->ctx)
+            release_script(This->ctx);
 
+        This->thread_id = 0;
+        break;
+    case SCRIPTSTATE_CLOSED:
         break;
     default:
         assert(0);
@@ -229,6 +252,11 @@ static ULONG WINAPI VBScript_Release(IActiveScript *iface)
     TRACE("(%p) ref=%d\n", iface, ref);
 
     if(!ref) {
+        if(This->ctx) {
+            decrease_state(This, SCRIPTSTATE_CLOSED);
+            destroy_script(This->ctx);
+            This->ctx = NULL;
+        }
         if(This->site)
             IActiveScriptSite_Release(This->site);
         heap_free(This);
@@ -413,7 +441,7 @@ static HRESULT WINAPI VBScript_GetScriptDispatch(IActiveScript *iface, LPCOLESTR
     if(!ppdisp)
         return E_POINTER;
 
-    if(This->thread_id != GetCurrentThreadId() || !This->ctx->script_obj) {
+    if(This->thread_id != GetCurrentThreadId() || !This->ctx || !This->ctx->script_obj) {
         *ppdisp = NULL;
         return E_UNEXPECTED;
     }




More information about the wine-cvs mailing list