vbscript: Create script context in CreateInstance.
Signed-off-by: Jacek Caban <jacek@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
79f39c2a8c
commit
271819e750
|
@ -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)
|
||||||
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)
|
||||||
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
|
||||||
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
|
||||||
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
|
||||||
|
|
||||||
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
|
||||||
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)
|
||||||
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;
|
return E_UNEXPECTED;
|
||||||
|
This->is_initialized = TRUE;
|
||||||
|
|
||||||
ctx = heap_alloc_zero(sizeof(script_ctx_t));
|
This->ctx->safeopt = This->safeopt;
|
||||||
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 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 = {
|
||||||
|
|
||||||
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
|
||||||
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;
|
||||||
|
|
Loading…
Reference in New Issue