Commit 271819e7 authored by Jacek Caban's avatar Jacek Caban Committed by Alexandre Julliard

vbscript: Create script context in CreateInstance.

parent 79f39c2a
...@@ -57,6 +57,7 @@ struct VBScript { ...@@ -57,6 +57,7 @@ struct VBScript {
script_ctx_t *ctx; script_ctx_t *ctx;
LONG thread_id; LONG thread_id;
LCID lcid; LCID lcid;
BOOL is_initialized;
}; };
typedef struct { typedef struct {
...@@ -227,9 +228,7 @@ static void decrease_state(VBScript *This, SCRIPTSTATE state) ...@@ -227,9 +228,7 @@ static void decrease_state(VBScript *This, SCRIPTSTATE state)
This->site = NULL; This->site = NULL;
} }
if(This->ctx) release_script(This->ctx);
release_script(This->ctx);
This->thread_id = 0; This->thread_id = 0;
break; break;
case SCRIPTSTATE_CLOSED: case SCRIPTSTATE_CLOSED:
...@@ -405,11 +404,8 @@ static ULONG WINAPI VBScript_Release(IActiveScript *iface) ...@@ -405,11 +404,8 @@ 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);
decrease_state(This, SCRIPTSTATE_CLOSED); destroy_script(This->ctx);
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);
...@@ -442,7 +438,7 @@ static HRESULT WINAPI VBScript_SetScriptSite(IActiveScript *iface, IActiveScript ...@@ -442,7 +438,7 @@ static HRESULT WINAPI VBScript_SetScriptSite(IActiveScript *iface, IActiveScript
if(hres == S_OK) if(hres == S_OK)
This->lcid = lcid; This->lcid = lcid;
return This->ctx ? set_ctx_site(This) : S_OK; return This->is_initialized ? set_ctx_site(This) : S_OK;
} }
static HRESULT WINAPI VBScript_GetScriptSite(IActiveScript *iface, REFIID riid, static HRESULT WINAPI VBScript_GetScriptSite(IActiveScript *iface, REFIID riid,
...@@ -470,7 +466,7 @@ static HRESULT WINAPI VBScript_SetScriptState(IActiveScript *iface, SCRIPTSTATE ...@@ -470,7 +466,7 @@ static HRESULT WINAPI VBScript_SetScriptState(IActiveScript *iface, SCRIPTSTATE
return S_OK; return S_OK;
} }
if(!This->ctx) if(!This->is_initialized)
return E_UNEXPECTED; return E_UNEXPECTED;
switch(ss) { switch(ss) {
...@@ -534,7 +530,7 @@ static HRESULT WINAPI VBScript_AddNamedItem(IActiveScript *iface, LPCOLESTR pstr ...@@ -534,7 +530,7 @@ static HRESULT WINAPI VBScript_AddNamedItem(IActiveScript *iface, LPCOLESTR pstr
TRACE("(%p)->(%s %x)\n", This, debugstr_w(pstrName), dwFlags); TRACE("(%p)->(%s %x)\n", This, debugstr_w(pstrName), dwFlags);
if(This->thread_id != GetCurrentThreadId() || !This->ctx || This->state == SCRIPTSTATE_CLOSED) if(This->thread_id != GetCurrentThreadId() || This->state == SCRIPTSTATE_CLOSED)
return E_UNEXPECTED; return E_UNEXPECTED;
if(dwFlags & SCRIPTITEM_GLOBALMEMBERS) { if(dwFlags & SCRIPTITEM_GLOBALMEMBERS) {
...@@ -597,7 +593,7 @@ static HRESULT WINAPI VBScript_GetScriptDispatch(IActiveScript *iface, LPCOLESTR ...@@ -597,7 +593,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 || !This->ctx->script_obj) { if(This->thread_id != GetCurrentThreadId() || !This->ctx->script_obj) {
*ppdisp = NULL; *ppdisp = NULL;
return E_UNEXPECTED; return E_UNEXPECTED;
} }
...@@ -749,29 +745,14 @@ static ULONG WINAPI VBScriptParse_Release(IActiveScriptParse *iface) ...@@ -749,29 +745,14 @@ static ULONG WINAPI VBScriptParse_Release(IActiveScriptParse *iface)
static HRESULT WINAPI VBScriptParse_InitNew(IActiveScriptParse *iface) static HRESULT WINAPI VBScriptParse_InitNew(IActiveScriptParse *iface)
{ {
VBScript *This = impl_from_IActiveScriptParse(iface); VBScript *This = impl_from_IActiveScriptParse(iface);
script_ctx_t *ctx, *old_ctx;
TRACE("(%p)\n", This); TRACE("(%p)\n", This);
if(This->ctx) if(This->is_initialized)
return E_UNEXPECTED;
ctx = heap_alloc_zero(sizeof(script_ctx_t));
if(!ctx)
return E_OUTOFMEMORY;
ctx->safeopt = This->safeopt;
heap_pool_init(&ctx->heap);
list_init(&ctx->objects);
list_init(&ctx->code_list);
list_init(&ctx->named_items);
old_ctx = InterlockedCompareExchangePointer((void**)&This->ctx, ctx, NULL);
if(old_ctx) {
destroy_script(ctx);
return E_UNEXPECTED; return E_UNEXPECTED;
} This->is_initialized = TRUE;
This->ctx->safeopt = This->safeopt;
return This->site ? set_ctx_site(This) : S_OK; return This->site ? set_ctx_site(This) : S_OK;
} }
...@@ -961,6 +942,7 @@ static const IObjectSafetyVtbl VBScriptSafetyVtbl = { ...@@ -961,6 +942,7 @@ static const IObjectSafetyVtbl VBScriptSafetyVtbl = {
HRESULT WINAPI VBScriptFactory_CreateInstance(IClassFactory *iface, IUnknown *pUnkOuter, REFIID riid, void **ppv) HRESULT WINAPI VBScriptFactory_CreateInstance(IClassFactory *iface, IUnknown *pUnkOuter, REFIID riid, void **ppv)
{ {
script_ctx_t *ctx;
VBScript *ret; VBScript *ret;
HRESULT hres; HRESULT hres;
...@@ -980,6 +962,18 @@ HRESULT WINAPI VBScriptFactory_CreateInstance(IClassFactory *iface, IUnknown *pU ...@@ -980,6 +962,18 @@ HRESULT WINAPI VBScriptFactory_CreateInstance(IClassFactory *iface, IUnknown *pU
ret->state = SCRIPTSTATE_UNINITIALIZED; ret->state = SCRIPTSTATE_UNINITIALIZED;
ret->safeopt = INTERFACE_USES_DISPEX; ret->safeopt = INTERFACE_USES_DISPEX;
ctx = ret->ctx = heap_alloc_zero(sizeof(*ctx));
if(!ctx) {
heap_free(ret);
return E_OUTOFMEMORY;
}
ctx->safeopt = INTERFACE_USES_DISPEX;
heap_pool_init(&ctx->heap);
list_init(&ctx->objects);
list_init(&ctx->code_list);
list_init(&ctx->named_items);
hres = IActiveScript_QueryInterface(&ret->IActiveScript_iface, riid, ppv); hres = IActiveScript_QueryInterface(&ret->IActiveScript_iface, riid, ppv);
IActiveScript_Release(&ret->IActiveScript_iface); IActiveScript_Release(&ret->IActiveScript_iface);
return hres; return hres;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment