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

This commit is contained in:
Jacek Caban 2011-10-14 16:21:52 +02:00 committed by Alexandre Julliard
parent b7a15ae7fa
commit b1c7f544ed

View File

@ -110,13 +110,10 @@ static HRESULT set_ctx_site(VBScript *This)
return S_OK; return S_OK;
} }
static void destroy_script(script_ctx_t *ctx) static void release_script(script_ctx_t *ctx)
{ {
collect_objects(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)) { while(!list_empty(&ctx->named_items)) {
named_item_t *iter = LIST_ENTRY(list_head(&ctx->named_items), named_item_t, entry); 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); heap_free(iter);
} }
if(ctx->host_global) if(ctx->host_global) {
IDispatch_Release(ctx->host_global); IDispatch_Release(ctx->host_global);
if(ctx->secmgr) ctx->host_global = NULL;
}
if(ctx->secmgr) {
IInternetHostSecurityManager_Release(ctx->secmgr); IInternetHostSecurityManager_Release(ctx->secmgr);
if(ctx->site) ctx->secmgr = NULL;
}
if(ctx->site) {
IActiveScriptSite_Release(ctx->site); IActiveScriptSite_Release(ctx->site);
if(ctx->err_obj) ctx->site = NULL;
}
if(ctx->err_obj) {
IDispatchEx_Release(&ctx->err_obj->IDispatchEx_iface); 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); 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); IDispatchEx_Release(&ctx->script_obj->IDispatchEx_iface);
ctx->script_obj = NULL;
}
vbsheap_free(&ctx->heap); 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); heap_free(ctx);
} }
@ -167,13 +191,12 @@ static void decrease_state(VBScript *This, SCRIPTSTATE state)
This->site = NULL; This->site = NULL;
} }
if(This->ctx)
release_script(This->ctx);
This->thread_id = 0; This->thread_id = 0;
break;
if(state == SCRIPTSTATE_CLOSED) { case SCRIPTSTATE_CLOSED:
destroy_script(This->ctx);
This->ctx = NULL;
}
break; break;
default: default:
assert(0); assert(0);
@ -229,6 +252,11 @@ static ULONG WINAPI VBScript_Release(IActiveScript *iface)
TRACE("(%p) ref=%d\n", iface, ref); TRACE("(%p) ref=%d\n", iface, ref);
if(!ref) { if(!ref) {
if(This->ctx) {
decrease_state(This, SCRIPTSTATE_CLOSED);
destroy_script(This->ctx);
This->ctx = NULL;
}
if(This->site) if(This->site)
IActiveScriptSite_Release(This->site); IActiveScriptSite_Release(This->site);
heap_free(This); heap_free(This);
@ -413,7 +441,7 @@ static HRESULT WINAPI VBScript_GetScriptDispatch(IActiveScript *iface, LPCOLESTR
if(!ppdisp) if(!ppdisp)
return E_POINTER; 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; *ppdisp = NULL;
return E_UNEXPECTED; return E_UNEXPECTED;
} }