diff --git a/js/jsd/jsd_xpc.cpp b/js/jsd/jsd_xpc.cpp --- a/js/jsd/jsd_xpc.cpp +++ b/js/jsd/jsd_xpc.cpp @@ -1133,32 +1133,36 @@ jsdScript::GetVersion (PRInt32 *_rval) ASSERT_VALID_EPHEMERAL; JSContext *cx = JSD_GetDefaultJSContext (mCx); JSScript *script = JSD_GetJSScript(mCx, mScript); *_rval = static_cast(JS_GetScriptVersion(cx, script)); return NS_OK; } NS_IMETHODIMP jsdScript::GetTag(PRUint32 *_rval) { + JSD_LockScriptSubsystem(mCx); if (!mTag) mTag = ++jsdScript::LastTag; *_rval = mTag; + JSD_UnlockScriptSubsystem(mCx); return NS_OK; } NS_IMETHODIMP jsdScript::Invalidate() { + JSD_LockScriptSubsystem(mCx); ASSERT_VALID_EPHEMERAL; mValid = PR_FALSE; + JSD_UnlockScriptSubsystem(mCx); /* release the addref we do in FromPtr */ jsdIScript *script = static_cast (JSD_GetScriptPrivate(mScript)); NS_ASSERTION (script == this, "That's not my script!"); NS_RELEASE(script); JSD_SetScriptPrivate(mScript, NULL); return NS_OK; } @@ -1178,82 +1182,94 @@ jsdScript::InvalidateAll () static_cast(JSD_GetScriptPrivate(script)); if (jsdis) jsdis->Invalidate(); } JSD_UnlockScriptSubsystem(cx); } NS_IMETHODIMP jsdScript::GetIsValid(PRBool *_rval) { + JSD_LockScriptSubsystem(mCx); *_rval = mValid; + JSD_UnlockScriptSubsystem(mCx); return NS_OK; } NS_IMETHODIMP jsdScript::SetFlags(PRUint32 flags) { + JSD_LockScriptSubsystem(mCx); ASSERT_VALID_EPHEMERAL; JSD_SetScriptFlags(mCx, mScript, flags); + JSD_UnlockScriptSubsystem(mCx); return NS_OK; } NS_IMETHODIMP jsdScript::GetFlags(PRUint32 *_rval) { + JSD_LockScriptSubsystem(mCx); ASSERT_VALID_EPHEMERAL; *_rval = JSD_GetScriptFlags(mCx, mScript); + JSD_UnlockScriptSubsystem(mCx); return NS_OK; } NS_IMETHODIMP jsdScript::GetFileName(nsACString &_rval) { _rval.Assign(*mFileName); return NS_OK; } NS_IMETHODIMP jsdScript::GetFunctionName(nsACString &_rval) { _rval.Assign(*mFunctionName); return NS_OK; } NS_IMETHODIMP jsdScript::GetParameterNames(PRUint32* count, PRUnichar*** paramNames) { + JSD_LockScriptSubsystem(mCx); ASSERT_VALID_EPHEMERAL; JSContext *cx = JSD_GetDefaultJSContext (mCx); if (!cx) { NS_WARNING("No default context !?"); + JSD_UnlockScriptSubsystem(mCx); return NS_ERROR_FAILURE; } JSFunction *fun = JSD_GetJSFunction (mCx, mScript); JSAutoRequest ar(cx); if (!fun || !fun->hasLocalNames() || fun->nargs == 0) { *count = 0; *paramNames = nsnull; + JSD_UnlockScriptSubsystem(mCx); return NS_OK; } PRUnichar **ret = static_cast(NS_Alloc(fun->nargs * sizeof(PRUnichar*))); - if (!ret) + if (!ret) { + JSD_UnlockScriptSubsystem(mCx); return NS_ERROR_OUT_OF_MEMORY; + } void *mark = JS_ARENA_MARK(&cx->tempPool); jsuword *names = js_GetLocalNameArray(cx, fun, &cx->tempPool); if (!names) { NS_Free(ret); + JSD_UnlockScriptSubsystem(mCx); return NS_ERROR_OUT_OF_MEMORY; } nsresult rv = NS_OK; for (uintN i = 0; i < fun->nargs; ++i) { JSAtom *atom = JS_LOCAL_NAME_TO_ATOM(names[i]); if (!atom) { ret[i] = 0; } else { jsval atomVal = ATOM_KEY(atom); @@ -1270,20 +1286,21 @@ jsdScript::GetParameterNames(PRUint32* c rv = NS_ERROR_OUT_OF_MEMORY; break; } } } JS_ARENA_RELEASE(&cx->tempPool, mark); if (NS_FAILED(rv)) return rv; *count = fun->nargs; *paramNames = ret; + JSD_UnlockScriptSubsystem(mCx); return NS_OK; } NS_IMETHODIMP jsdScript::GetFunctionObject(jsdIValue **_rval) { JSFunction *fun = JSD_GetJSFunction(mCx, mScript); if (!fun) return NS_ERROR_NOT_AVAILABLE;