From d19cdef8f85c8aaebdc4a88225b63758c54f644c Mon Sep 17 00:00:00 2001 From: Jacek Caban Date: Mon, 1 Sep 2008 01:23:16 +0200 Subject: [PATCH] jscript: Added IActiveScriptParse::InitNew implementation. --- dlls/jscript/jscript.c | 37 ++++++++++++++++++++++++++++++++---- dlls/jscript/jscript.h | 9 +++++++++ dlls/jscript/jscript_main.c | 1 - dlls/jscript/tests/jscript.c | 6 ++++++ 4 files changed, 48 insertions(+), 5 deletions(-) diff --git a/dlls/jscript/jscript.c b/dlls/jscript/jscript.c index f058e265d40..8e3f752b50f 100644 --- a/dlls/jscript/jscript.c +++ b/dlls/jscript/jscript.c @@ -17,7 +17,6 @@ */ #include "jscript.h" -#include "activscp.h" #include "objsafe.h" #include "wine/debug.h" @@ -34,6 +33,7 @@ typedef struct { LONG ref; DWORD safeopt; + script_ctx_t *ctx; } JScript; #define ACTSCRIPT(x) ((IActiveScript*) &(x)->lpIActiveScriptVtbl) @@ -42,6 +42,14 @@ typedef struct { #define ACTSCPPROP(x) ((IActiveScriptProperty*) &(x)->lpIActiveScriptPropertyVtbl) #define OBJSAFETY(x) ((IObjectSafety*) &(x)->lpIObjectSafetyVtbl) +void script_release(script_ctx_t *ctx) +{ + if(--ctx->ref) + return; + + heap_free(ctx); +} + #define ACTSCRIPT_THIS(iface) DEFINE_THIS(JScript, IActiveScript, iface) static HRESULT WINAPI JScript_QueryInterface(IActiveScript *iface, REFIID riid, void **ppv) @@ -100,6 +108,8 @@ static ULONG WINAPI JScript_Release(IActiveScript *iface) TRACE("(%p) ref=%d\n", iface, ref); if(!ref) { + if(This->ctx) + script_release(This->ctx); heap_free(This); unlock_module(); } @@ -251,8 +261,27 @@ static ULONG WINAPI JScriptParse_Release(IActiveScriptParse *iface) static HRESULT WINAPI JScriptParse_InitNew(IActiveScriptParse *iface) { JScript *This = ASPARSE_THIS(iface); - FIXME("(%p)\n", This); - return E_NOTIMPL; + script_ctx_t *ctx; + + TRACE("(%p)\n", This); + + if(This->ctx) + return E_UNEXPECTED; + + ctx = heap_alloc_zero(sizeof(script_ctx_t)); + if(!ctx) + return E_OUTOFMEMORY; + + ctx->ref = 1; + ctx->state = SCRIPTSTATE_UNINITIALIZED; + + ctx = InterlockedCompareExchangePointer((void**)&This->ctx, ctx, NULL); + if(ctx) { + script_release(ctx); + return E_UNEXPECTED; + } + + return S_OK; } static HRESULT WINAPI JScriptParse_AddScriptlet(IActiveScriptParse *iface, @@ -449,7 +478,7 @@ HRESULT WINAPI JScriptFactory_CreateInstance(IClassFactory *iface, IUnknown *pUn lock_module(); - ret = heap_alloc(sizeof(*ret)); + ret = heap_alloc_zero(sizeof(*ret)); ret->lpIActiveScriptVtbl = &JScriptVtbl; ret->lpIActiveScriptParseVtbl = &JScriptParseVtbl; diff --git a/dlls/jscript/jscript.h b/dlls/jscript/jscript.h index afdd0c74319..98948bc089f 100644 --- a/dlls/jscript/jscript.h +++ b/dlls/jscript/jscript.h @@ -25,6 +25,15 @@ #include "winbase.h" #include "winuser.h" #include "ole2.h" +#include "activscp.h" + +typedef struct _script_ctx_t script_ctx_t; + +struct _script_ctx_t { + LONG ref; + + SCRIPTSTATE state; +}; HRESULT WINAPI JScriptFactory_CreateInstance(IClassFactory*,IUnknown*,REFIID,void**); diff --git a/dlls/jscript/jscript_main.c b/dlls/jscript/jscript_main.c index 7cb46bfc489..045c96ef0c4 100644 --- a/dlls/jscript/jscript_main.c +++ b/dlls/jscript/jscript_main.c @@ -22,7 +22,6 @@ #include "winreg.h" #include "advpub.h" -#include "activscp.h" #include "activaut.h" #include "objsafe.h" diff --git a/dlls/jscript/tests/jscript.c b/dlls/jscript/tests/jscript.c index 01a90bf9a3b..f7dd162acb5 100644 --- a/dlls/jscript/tests/jscript.c +++ b/dlls/jscript/tests/jscript.c @@ -110,6 +110,12 @@ static void test_jscript(void) test_safety(unk); + hres = IActiveScriptParse_InitNew(parse); + ok(hres == S_OK, "InitNew failed: %08x\n", hres); + + hres = IActiveScriptParse_InitNew(parse); + ok(hres == E_UNEXPECTED, "InitNew failed: %08x, expected E_UNEXPECTED\n", hres); + IActiveScriptParse_Release(parse); IActiveScript_Release(script); IUnknown_Release(unk);