Bug 758509 (part 6) - Initialize JSScript::savedCallerFun in Create(). r=luke.

--HG--
extra : rebase_source : cc6160a1678a1d9e7957c66fffdeefdbeaceb31e
This commit is contained in:
Nicholas Nethercote 2012-06-06 21:37:37 -07:00
parent 0620ba99c8
commit c46732f31b
5 changed files with 26 additions and 35 deletions

View File

@ -112,9 +112,10 @@ frontend::CompileScript(JSContext *cx, JSObject *scopeChain, StackFrame *callerF
if (!tc.init())
return NULL;
bool savedCallerFun = compileAndGo && callerFrame && callerFrame->isFunctionFrame();
Rooted<JSScript*> script(cx);
script = JSScript::Create(cx, principals, originPrincipals, compileAndGo, noScriptRval,
version);
script = JSScript::Create(cx, savedCallerFun, principals, originPrincipals, compileAndGo,
noScriptRval, version);
if (!script)
return NULL;
@ -137,10 +138,6 @@ frontend::CompileScript(JSContext *cx, JSObject *scopeChain, StackFrame *callerF
if (callerFrame && callerFrame->isScriptFrame() && callerFrame->script()->strictModeCode)
sc.setInStrictMode();
#ifdef DEBUG
bool savedCallerFun;
savedCallerFun = false;
#endif
if (compileAndGo) {
if (source) {
/*
@ -165,9 +162,6 @@ frontend::CompileScript(JSContext *cx, JSObject *scopeChain, StackFrame *callerF
funbox->emitLink = bce.objectList.lastbox;
bce.objectList.lastbox = funbox;
bce.objectList.length++;
#ifdef DEBUG
savedCallerFun = true;
#endif
}
}
@ -247,8 +241,6 @@ frontend::CompileScript(JSContext *cx, JSObject *scopeChain, StackFrame *callerF
if (!script->fullyInitFromEmitter(cx, &bce))
return NULL;
JS_ASSERT(script->savedCallerFun == savedCallerFun);
if (!MarkInnerAndOuterFunctions(cx, script))
return NULL;
@ -266,7 +258,8 @@ frontend::CompileFunctionBody(JSContext *cx, JSFunction *fun,
const char *filename, unsigned lineno, JSVersion version)
{
Parser parser(cx, principals, originPrincipals, chars, length, filename, lineno, version,
/* cfp = */ NULL, /* foldConstants = */ true, /* compileAndGo = */ false);
/* callerFrame = */ NULL, /* foldConstants = */ true,
/* compileAndGo = */ false);
if (!parser.init())
return false;
@ -279,8 +272,9 @@ frontend::CompileFunctionBody(JSContext *cx, JSFunction *fun,
return false;
Rooted<JSScript*> script(cx);
script = JSScript::Create(cx, principals, originPrincipals, /* compileAndGo = */ false,
/* noScriptRval = */ false, version);
script = JSScript::Create(cx, /* savedCallerFun = */ false, principals, originPrincipals,
/* compileAndGo = */ false, /* noScriptRval = */ false,
version);
if (!script)
return false;

View File

@ -4864,9 +4864,9 @@ EmitFunc(JSContext *cx, BytecodeEmitter *bce, ParseNode *pn)
// Inherit various things (principals, version, etc) from the parent.
Rooted<JSScript*> script(cx);
Rooted<JSScript*> parent(cx, bce->script);
script = JSScript::Create(cx, parent->principals, parent->originPrincipals,
parent->compileAndGo, /* noScriptRval = */ false,
parent->getVersion());
script = JSScript::Create(cx, parent->savedCallerFun, parent->principals,
parent->originPrincipals, parent->compileAndGo,
/* noScriptRval = */ false, parent->getVersion());
if (!script)
return false;

View File

@ -584,7 +584,8 @@ js::XDRScript(XDRState<mode> *xdr, JSScript **scriptp, JSScript *parentScript)
JS_ASSERT((version_ & VersionFlags::FULL_MASK) == unsigned(version_));
// principals and originPrincipals are set with xdr->initScriptPrincipals(script) below.
script = JSScript::Create(cx, /* principals = */ NULL, /* originPrincipals = */ NULL,
script = JSScript::Create(cx, !!(scriptBits & (1 << SavedCallerFun)),
/* principals = */ NULL, /* originPrincipals = */ NULL,
/* compileAndGo = */ false,
!!(scriptBits & (1 << NoScriptRval)), version_);
if (!script || !script->partiallyInit(cx, length, nsrcnotes, natoms, nobjects,
@ -601,8 +602,6 @@ js::XDRScript(XDRState<mode> *xdr, JSScript **scriptp, JSScript *parentScript)
notes = script->notes();
*scriptp = script;
if (scriptBits & (1 << SavedCallerFun))
script->savedCallerFun = true;
if (scriptBits & (1 << StrictModeCode))
script->strictModeCode = true;
if (scriptBits & (1 << ContainsDynamicNameAccess))
@ -1095,8 +1094,9 @@ ScriptDataSize(uint32_t length, uint32_t nsrcnotes, uint32_t natoms,
}
JSScript *
JSScript::Create(JSContext *cx, JSPrincipals *principals, JSPrincipals *originPrincipals,
bool compileAndGo, bool noScriptRval, JSVersion version)
JSScript::Create(JSContext *cx, bool savedCallerFun, JSPrincipals *principals,
JSPrincipals *originPrincipals, bool compileAndGo, bool noScriptRval,
JSVersion version)
{
JSScript *script = js_NewGCScript(cx);
if (!script)
@ -1104,6 +1104,8 @@ JSScript::Create(JSContext *cx, JSPrincipals *principals, JSPrincipals *originPr
PodZero(script);
script->savedCallerFun = savedCallerFun;
/* Establish invariant: principals implies originPrincipals. */
if (principals) {
script->principals = principals;
@ -1329,11 +1331,6 @@ JSScript::fullyInitFromEmitter(JSContext *cx, BytecodeEmitter *bce)
if (bce->constList.length() != 0)
bce->constList.finish(script->consts());
script->strictModeCode = bce->sc->inStrictMode();
if (script->compileAndGo) {
const StackFrame *fp = bce->parser->callerFrame;
if (fp && fp->isFunctionFrame())
script->savedCallerFun = true;
}
script->bindingsAccessedDynamically = bce->sc->bindingsAccessedDynamically();
script->funHasExtensibleScope = bce->sc->funHasExtensibleScope();
script->hasSingletons = bce->hasSingletons;
@ -1793,7 +1790,8 @@ js::CloneScript(JSContext *cx, HandleScript src)
/* Now that all fallible allocation is complete, create the GC thing. */
JSScript *dst = JSScript::Create(cx, cx->compartment->principals, src->originPrincipals,
JSScript *dst = JSScript::Create(cx, src->savedCallerFun,
cx->compartment->principals, src->originPrincipals,
src->compileAndGo, src->noScriptRval, src->getVersion());
if (!dst) {
Foreground::free_(data);
@ -1830,7 +1828,6 @@ js::CloneScript(JSContext *cx, HandleScript src)
dst->setNeedsArgsObj(src->needsArgsObj());
}
dst->cloneHasArray(src);
dst->savedCallerFun = src->savedCallerFun;
dst->strictModeCode = src->strictModeCode;
dst->bindingsAccessedDynamically = src->bindingsAccessedDynamically;
dst->funHasExtensibleScope = src->funHasExtensibleScope;

View File

@ -565,9 +565,9 @@ struct JSScript : public js::gc::Cell
//
public:
static JSScript *Create(JSContext *cx, JSPrincipals *principals,
JSPrincipals *originPrincipals, bool compileAndGo, bool noScriptRval,
JSVersion version);
static JSScript *Create(JSContext *cx, bool savedCallerFun,
JSPrincipals *principals, JSPrincipals *originPrincipals, bool compileAndGo,
bool noScriptRval, JSVersion version);
// Three ways ways to initialize a JSScript. Callers of partiallyInit()
// and fullyInitTrivial() are responsible for notifying the debugger after

View File

@ -112,9 +112,9 @@ GlobalObject::initFunctionAndObjectClasses(JSContext *cx)
functionProto->flags |= JSFUN_PROTOTYPE;
Rooted<JSScript*> script(cx);
script = JSScript::Create(cx, /* principals = */ NULL, /* originPrincipals = */ NULL,
/* compileAndGo = */ false, /* noScriptRval = */ true,
JSVERSION_DEFAULT);
script = JSScript::Create(cx, /* savedCallerFun = */ false, /* principals = */ NULL,
/* originPrincipals = */ NULL, /* compileAndGo = */ false,
/* noScriptRval = */ true, JSVERSION_DEFAULT);
if (!script || !script->fullyInitTrivial(cx))
return NULL;