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

View File

@ -4864,9 +4864,9 @@ EmitFunc(JSContext *cx, BytecodeEmitter *bce, ParseNode *pn)
// Inherit various things (principals, version, etc) from the parent. // Inherit various things (principals, version, etc) from the parent.
Rooted<JSScript*> script(cx); Rooted<JSScript*> script(cx);
Rooted<JSScript*> parent(cx, bce->script); Rooted<JSScript*> parent(cx, bce->script);
script = JSScript::Create(cx, parent->principals, parent->originPrincipals, script = JSScript::Create(cx, parent->savedCallerFun, parent->principals,
parent->compileAndGo, /* noScriptRval = */ false, parent->originPrincipals, parent->compileAndGo,
parent->getVersion()); /* noScriptRval = */ false, parent->getVersion());
if (!script) if (!script)
return false; 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_)); JS_ASSERT((version_ & VersionFlags::FULL_MASK) == unsigned(version_));
// principals and originPrincipals are set with xdr->initScriptPrincipals(script) below. // 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, /* compileAndGo = */ false,
!!(scriptBits & (1 << NoScriptRval)), version_); !!(scriptBits & (1 << NoScriptRval)), version_);
if (!script || !script->partiallyInit(cx, length, nsrcnotes, natoms, nobjects, 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(); notes = script->notes();
*scriptp = script; *scriptp = script;
if (scriptBits & (1 << SavedCallerFun))
script->savedCallerFun = true;
if (scriptBits & (1 << StrictModeCode)) if (scriptBits & (1 << StrictModeCode))
script->strictModeCode = true; script->strictModeCode = true;
if (scriptBits & (1 << ContainsDynamicNameAccess)) if (scriptBits & (1 << ContainsDynamicNameAccess))
@ -1095,8 +1094,9 @@ ScriptDataSize(uint32_t length, uint32_t nsrcnotes, uint32_t natoms,
} }
JSScript * JSScript *
JSScript::Create(JSContext *cx, JSPrincipals *principals, JSPrincipals *originPrincipals, JSScript::Create(JSContext *cx, bool savedCallerFun, JSPrincipals *principals,
bool compileAndGo, bool noScriptRval, JSVersion version) JSPrincipals *originPrincipals, bool compileAndGo, bool noScriptRval,
JSVersion version)
{ {
JSScript *script = js_NewGCScript(cx); JSScript *script = js_NewGCScript(cx);
if (!script) if (!script)
@ -1104,6 +1104,8 @@ JSScript::Create(JSContext *cx, JSPrincipals *principals, JSPrincipals *originPr
PodZero(script); PodZero(script);
script->savedCallerFun = savedCallerFun;
/* Establish invariant: principals implies originPrincipals. */ /* Establish invariant: principals implies originPrincipals. */
if (principals) { if (principals) {
script->principals = principals; script->principals = principals;
@ -1329,11 +1331,6 @@ JSScript::fullyInitFromEmitter(JSContext *cx, BytecodeEmitter *bce)
if (bce->constList.length() != 0) if (bce->constList.length() != 0)
bce->constList.finish(script->consts()); bce->constList.finish(script->consts());
script->strictModeCode = bce->sc->inStrictMode(); 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->bindingsAccessedDynamically = bce->sc->bindingsAccessedDynamically();
script->funHasExtensibleScope = bce->sc->funHasExtensibleScope(); script->funHasExtensibleScope = bce->sc->funHasExtensibleScope();
script->hasSingletons = bce->hasSingletons; 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. */ /* 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()); src->compileAndGo, src->noScriptRval, src->getVersion());
if (!dst) { if (!dst) {
Foreground::free_(data); Foreground::free_(data);
@ -1830,7 +1828,6 @@ js::CloneScript(JSContext *cx, HandleScript src)
dst->setNeedsArgsObj(src->needsArgsObj()); dst->setNeedsArgsObj(src->needsArgsObj());
} }
dst->cloneHasArray(src); dst->cloneHasArray(src);
dst->savedCallerFun = src->savedCallerFun;
dst->strictModeCode = src->strictModeCode; dst->strictModeCode = src->strictModeCode;
dst->bindingsAccessedDynamically = src->bindingsAccessedDynamically; dst->bindingsAccessedDynamically = src->bindingsAccessedDynamically;
dst->funHasExtensibleScope = src->funHasExtensibleScope; dst->funHasExtensibleScope = src->funHasExtensibleScope;

View File

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

View File

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