☠☠ backed out by bfc988bd3c77 ☠ ☠ | |
author | Shu-yu Guo <shu@rfrn.org> |
Fri, 19 Jun 2015 01:21:13 -0700 | |
changeset 249748 | a103caa361833549bb9a868301fb614863439bfa |
parent 249747 | 18c025c16bed1e10370d629233a6b71ac0782bd6 |
child 249749 | 6318eba2d3fe5df3d10eb46658677ddab7ea4121 |
push id | 28936 |
push user | ryanvm@gmail.com |
push date | Fri, 19 Jun 2015 20:34:42 +0000 |
treeherder | mozilla-central@c319f262ce3e [default view] [failures only] |
perfherder | [talos] [build metrics] [platform microbench] (compared to previous push) |
reviewers | luke |
bugs | 1165486 |
milestone | 41.0a1 |
first release with | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
last release without | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
--- a/js/src/builtin/Eval.cpp +++ b/js/src/builtin/Eval.cpp @@ -508,17 +508,17 @@ js::IsAnyBuiltinEval(JSFunction* fun) JS_FRIEND_API(bool) js::ExecuteInGlobalAndReturnScope(JSContext* cx, HandleObject global, HandleScript scriptArg, MutableHandleObject scopeArg) { CHECK_REQUEST(cx); assertSameCompartment(cx, global); MOZ_ASSERT(global->is<GlobalObject>()); - MOZ_RELEASE_ASSERT(scriptArg->hasPollutedGlobalScope()); + MOZ_RELEASE_ASSERT(scriptArg->hasNonSyntacticScope()); RootedScript script(cx, scriptArg); if (script->compartment() != cx->compartment()) { script = CloneScript(cx, nullptr, nullptr, script); if (!script) return false; Debugger::onNewScript(cx, script);
--- a/js/src/frontend/BytecodeEmitter.cpp +++ b/js/src/frontend/BytecodeEmitter.cpp @@ -1582,19 +1582,19 @@ BytecodeEmitter::tryConvertFreeName(Pars } } // Unbound names aren't recognizable global-property references if the // script is inside a non-global eval call. if (insideNonGlobalEval) return false; - // Skip trying to use GNAME ops if we know our script has a polluted - // global scope, since they'll just get treated as NAME ops anyway. - if (script->hasPollutedGlobalScope()) + // Skip trying to use GNAME ops if we know our script has a non-syntactic + // scope, since they'll just get treated as NAME ops anyway. + if (script->hasNonSyntacticScope()) return false; // Deoptimized names also aren't necessarily globals. if (pn->isDeoptimized()) return false; if (sc->isFunctionBox()) { // Unbound names in function code may not be globals if new locals can
--- a/js/src/jit/BaselineBailouts.cpp +++ b/js/src/jit/BaselineBailouts.cpp @@ -699,23 +699,24 @@ InitFromBailout(JSContext* cx, HandleScr // not resume into baseline code, but instead into // HandleExceptionBaseline, so *do* set the scope chain here. if (iter.pcOffset() != 0 || iter.resumeAfter() || (excInfo && excInfo->propagatingIonExceptionForDebugMode())) { scopeChain = fun->environment(); } } else { - // For global scripts without a polluted global scope the scope + // For global scripts without a non-syntactic scope the scope // chain is the script's global (Ion does not compile scripts - // with a polluted global scope). Also note that it's invalid to - // resume into the prologue in this case because the prologue - // expects the scope chain in R1 for eval and global scripts. + // with a non-syntactic global scope). Also note that it's + // invalid to resume into the prologue in this case because + // the prologue expects the scope chain in R1 for eval and + // global scripts. MOZ_ASSERT(!script->isForEval()); - MOZ_ASSERT(!script->hasPollutedGlobalScope()); + MOZ_ASSERT(!script->hasNonSyntacticScope()); scopeChain = &(script->global()); } } // Make sure to add HAS_RVAL to flags here because setFlags() below // will clobber it. returnValue = iter.read(); flags |= BaselineFrame::HAS_RVAL;
--- a/js/src/jit/BaselineCompiler.cpp +++ b/js/src/jit/BaselineCompiler.cpp @@ -2058,17 +2058,17 @@ BaselineCompiler::emit_JSOP_IN() frame.push(R0); return true; } bool BaselineCompiler::emit_JSOP_GETGNAME() { - if (script->hasPollutedGlobalScope()) + if (script->hasNonSyntacticScope()) return emit_JSOP_GETNAME(); RootedPropertyName name(cx, script->getName(pc)); if (name == cx->names().undefined) { frame.push(UndefinedValue()); return true; } @@ -2093,17 +2093,17 @@ BaselineCompiler::emit_JSOP_GETGNAME() // Mark R0 as pushed stack value. frame.push(R0); return true; } bool BaselineCompiler::emit_JSOP_BINDGNAME() { - if (!script->hasPollutedGlobalScope()) { + if (!script->hasNonSyntacticScope()) { frame.push(ObjectValue(script->global())); return true; } return emit_JSOP_BINDNAME(); } bool @@ -2916,17 +2916,17 @@ BaselineCompiler::emit_JSOP_IMPLICITTHIS frame.push(R0); return true; } bool BaselineCompiler::emit_JSOP_GIMPLICITTHIS() { - if (!script->hasPollutedGlobalScope()) { + if (!script->hasNonSyntacticScope()) { frame.push(UndefinedValue()); return true; } return emit_JSOP_IMPLICITTHIS(); } bool
--- a/js/src/jit/BaselineIC.cpp +++ b/js/src/jit/BaselineIC.cpp @@ -6128,17 +6128,17 @@ DoGetNameFallback(JSContext* cx, Baselin bool isTemporarilyUnoptimizable = false; // Attach new stub. if (stub->numOptimizedStubs() >= ICGetName_Fallback::MAX_OPTIMIZED_STUBS) { // TODO: Discard all stubs in this IC and replace with generic stub. attached = true; } - if (!attached && IsGlobalOp(JSOp(*pc)) && !script->hasPollutedGlobalScope()) { + if (!attached && IsGlobalOp(JSOp(*pc)) && !script->hasNonSyntacticScope()) { if (!TryAttachGlobalNameAccessorStub(cx, script, pc, stub, scopeChain.as<GlobalObject>(), name, &attached, &isTemporarilyUnoptimizable)) { return false; } } static_assert(JSOP_GETGNAME_LENGTH == JSOP_GETNAME_LENGTH, @@ -6158,17 +6158,17 @@ DoGetNameFallback(JSContext* cx, Baselin return true; // Add a type monitor stub for the resulting value. if (!stub->addMonitorStubForValue(cx, script, res)) return false; if (attached) return true; - if (IsGlobalOp(JSOp(*pc)) && !script->hasPollutedGlobalScope()) { + if (IsGlobalOp(JSOp(*pc)) && !script->hasNonSyntacticScope()) { Handle<GlobalObject*> global = scopeChain.as<GlobalObject>(); if (!TryAttachGlobalNameValueStub(cx, script, pc, stub, global, name, &attached)) return false; } else { if (!TryAttachScopeNameStub(cx, script, stub, scopeChain, name, &attached)) return false; }
--- a/js/src/jit/BytecodeAnalysis.cpp +++ b/js/src/jit/BytecodeAnalysis.cpp @@ -165,17 +165,17 @@ BytecodeAnalysis::init(TempAllocator& al case JSOP_DEFCONST: case JSOP_SETCONST: usesScopeChain_ = true; break; case JSOP_GETGNAME: case JSOP_SETGNAME: case JSOP_STRICTSETGNAME: - if (script_->hasPollutedGlobalScope()) + if (script_->hasNonSyntacticScope()) usesScopeChain_ = true; break; case JSOP_FINALLY: hasTryFinally_ = true; break; case JSOP_SETARG:
--- a/js/src/jit/Ion.cpp +++ b/js/src/jit/Ion.cpp @@ -2168,22 +2168,22 @@ CheckScript(JSContext* cx, JSScript* scr return false; } if (script->isGenerator()) { TrackAndSpewIonAbort(cx, script, "generator script"); return false; } - if (script->hasPollutedGlobalScope() && !script->functionNonDelazifying()) { - // Support functions with a polluted global scope but not other + if (script->hasNonSyntacticScope() && !script->functionNonDelazifying()) { + // Support functions with a non-syntactic global scope but not other // scripts. For global scripts, IonBuilder currently uses the global // object as scope chain, this is not valid when the script has a - // polluted global scope. - TrackAndSpewIonAbort(cx, script, "has polluted global scope"); + // non-syntactic global scope. + TrackAndSpewIonAbort(cx, script, "has non-syntactic global scope"); return false; } return true; } static MethodStatus CheckScriptSize(JSContext* cx, JSScript* script)
--- a/js/src/jit/IonBuilder.cpp +++ b/js/src/jit/IonBuilder.cpp @@ -613,17 +613,17 @@ IonBuilder::analyzeNewLoopTypes(MBasicBl } else { MIRType type = MIRType_None; switch (*last) { case JSOP_VOID: case JSOP_UNDEFINED: type = MIRType_Undefined; break; case JSOP_GIMPLICITTHIS: - if (!script()->hasPollutedGlobalScope()) + if (!script()->hasNonSyntacticScope()) type = MIRType_Undefined; break; case JSOP_NULL: type = MIRType_Null; break; case JSOP_ZERO: case JSOP_ONE: case JSOP_INT8: @@ -1177,20 +1177,20 @@ IonBuilder::initScopeChain(MDefinition* return false; } scope = createCallObject(callee, scope); if (!scope) return false; } } else { - // For global scripts without a polluted global scope, the scope chain - // is the global object. + // For global scripts without a non-syntactic global scope, the scope + // chain is the global object. MOZ_ASSERT(!script()->isForEval()); - MOZ_ASSERT(!script()->hasPollutedGlobalScope()); + MOZ_ASSERT(!script()->hasNonSyntacticScope()); scope = constant(ObjectValue(script()->global())); } current->setScopeChain(scope); return true; } bool @@ -1795,26 +1795,26 @@ IonBuilder::inspectOpcode(JSOp op) return pushConstant(Int32Value(GET_INT8(pc))); case JSOP_UINT16: return pushConstant(Int32Value(GET_UINT16(pc))); case JSOP_GETGNAME: { PropertyName* name = info().getAtom(pc)->asPropertyName(); - if (!script()->hasPollutedGlobalScope()) + if (!script()->hasNonSyntacticScope()) return jsop_getgname(name); return jsop_getname(name); } case JSOP_SETGNAME: case JSOP_STRICTSETGNAME: { PropertyName* name = info().getAtom(pc)->asPropertyName(); - if (script()->hasPollutedGlobalScope()) + if (script()->hasNonSyntacticScope()) return jsop_setprop(name); JSObject* obj = &script()->global(); return setStaticName(obj, name); } case JSOP_GETNAME: { PropertyName* name = info().getAtom(pc)->asPropertyName(); @@ -1823,17 +1823,17 @@ IonBuilder::inspectOpcode(JSOp op) case JSOP_GETINTRINSIC: { PropertyName* name = info().getAtom(pc)->asPropertyName(); return jsop_intrinsic(name); } case JSOP_BINDGNAME: - if (!script()->hasPollutedGlobalScope()) + if (!script()->hasNonSyntacticScope()) return pushConstant(ObjectValue(script()->global())); // Fall through to JSOP_BINDNAME case JSOP_BINDNAME: return jsop_bindname(info().getName(pc)); case JSOP_DUP: current->pushSlot(current->stackDepth() - 1); return true; @@ -1970,17 +1970,17 @@ IonBuilder::inspectOpcode(JSOp op) case JSOP_DEBUGLEAVEBLOCK: return true; case JSOP_DEBUGGER: return jsop_debugger(); case JSOP_GIMPLICITTHIS: - if (!script()->hasPollutedGlobalScope()) + if (!script()->hasNonSyntacticScope()) return pushConstant(UndefinedValue()); // Just fall through to the unsupported bytecode case. break; case JSOP_NEWTARGET: return jsop_newtarget(); @@ -7608,17 +7608,17 @@ IonBuilder::jsop_getgname(PropertyName* return jsop_getname(name); } bool IonBuilder::jsop_getname(PropertyName* name) { MDefinition* object; - if (IsGlobalOp(JSOp(*pc)) && !script()->hasPollutedGlobalScope()) { + if (IsGlobalOp(JSOp(*pc)) && !script()->hasNonSyntacticScope()) { MInstruction* global = constant(ObjectValue(script()->global())); object = global; } else { current->push(current->scopeChain()); object = current->pop(); } MGetNameCache* ins;
--- a/js/src/jit/JitFrames.cpp +++ b/js/src/jit/JitFrames.cpp @@ -2548,17 +2548,17 @@ InlineFrameIterator::computeScopeChain(V // are walking the frame during the function prologue, before the scope // chain has been initialized. if (isFunctionFrame()) return callee(fallback)->environment(); // Ion does not handle non-function scripts that have anything other than // the global on their scope chain. MOZ_ASSERT(!script()->isForEval()); - MOZ_ASSERT(!script()->hasPollutedGlobalScope()); + MOZ_ASSERT(!script()->hasNonSyntacticScope()); return &script()->global(); } bool InlineFrameIterator::isFunctionFrame() const { return !!calleeTemplate_; }
--- a/js/src/jsapi.cpp +++ b/js/src/jsapi.cpp @@ -4191,17 +4191,17 @@ ExecuteScript(JSContext* cx, HandleObjec { RootedScript script(cx, scriptArg); MOZ_ASSERT(!cx->runtime()->isAtomsCompartment(cx->compartment())); AssertHeapIsIdle(cx); CHECK_REQUEST(cx); assertSameCompartment(cx, obj, scriptArg); - if (!script->hasPollutedGlobalScope() && !obj->is<GlobalObject>()) { + if (!script->hasNonSyntacticScope() && !obj->is<GlobalObject>()) { script = CloneScript(cx, nullptr, nullptr, script, HasPollutedGlobalScope); if (!script) return false; js::Debugger::onNewScript(cx, script); } AutoLastFrameCheck lfc(cx); return Execute(cx, script, *obj, rval); }
--- a/js/src/jsfun.cpp +++ b/js/src/jsfun.cpp @@ -2096,21 +2096,21 @@ js::CloneFunctionObjectUseSameScript(JSC // in that case we have some actual scope objects on our scope chain and // whatnot; whoever put them there should be responsible for setting our // script's flags appropriately. We hit this case for JSOP_LAMBDA, for // example. if (IsSyntacticScope(newParent)) return true; // We need to clone the script if we're interpreted and not already marked - // as having a polluted scope. If we're lazy, go ahead and clone the - // script; see the big comment at the end of CloneScript for the explanation - // of what's going on there. + // as having a non-syntactic scope. If we're lazy, go ahead and clone the + // script; see the big comment at the end of CopyScriptInternal for the + // explanation of what's going on there. return !fun->isInterpreted() || - (fun->hasScript() && fun->nonLazyScript()->hasPollutedGlobalScope()); + (fun->hasScript() && fun->nonLazyScript()->hasNonSyntacticScope()); } JSFunction* js::CloneFunctionObject(JSContext* cx, HandleFunction fun, HandleObject parent, gc::AllocKind allocKind, NewObjectKind newKindArg /* = GenericObject */, HandleObject proto) {
--- a/js/src/jsobj.h +++ b/js/src/jsobj.h @@ -417,20 +417,20 @@ class JSObject : public js::gc::Cell * Scope chains. * * The scope chain of an object is the link in the search path when a script * does a name lookup on a scope object. For JS internal scope objects --- * Call, DeclEnv, Block, and With --- the chain is stored in the first fixed * slot of the object. For other scope objects, the chain goes directly to * the global. * - * In code which is not marked hasPollutedGlobalScope, scope chains can + * In code which is not marked hasNonSyntacticScope, scope chains can * contain only syntactic scope objects (see IsSyntacticScope) with a global * object at the root as the scope of the outermost non-function script. In - * hasPollutedGlobalScope code, the scope of the outermost non-function + * hasNonSyntacticScope code, the scope of the outermost non-function * script might not be a global object, and can have a mix of other objects * above it before the global object is reached. */ /* * Get the enclosing scope of an object. When called on non-scope object, * this will just be the global (the name "enclosing scope" still applies * in this situation because non-scope objects can be on the scope chain).
--- a/js/src/jsscript.cpp +++ b/js/src/jsscript.cpp @@ -595,17 +595,17 @@ js::XDRScript(XDRState<mode>* xdr, Handl IsLegacyGenerator, IsStarGenerator, OwnSource, ExplicitUseStrict, SelfHosted, HasSingleton, TreatAsRunOnce, HasLazyScript, - HasPollutedGlobalScope, + HasNonSyntacticScope, }; uint32_t length, lineno, column, nslots, staticLevel; uint32_t natoms, nsrcnotes, i; uint32_t nconsts, nobjects, nregexps, ntrynotes, nblockscopes, nyieldoffsets; uint32_t prologueLength, version; uint32_t funLength = 0; uint32_t nTypeSets = 0; @@ -727,18 +727,18 @@ js::XDRScript(XDRState<mode>* xdr, Handl if (script->isStarGenerator()) scriptBits |= (1 << IsStarGenerator); if (script->hasSingletons()) scriptBits |= (1 << HasSingleton); if (script->treatAsRunOnce()) scriptBits |= (1 << TreatAsRunOnce); if (script->isRelazifiable()) scriptBits |= (1 << HasLazyScript); - if (script->hasPollutedGlobalScope()) - scriptBits |= (1 << HasPollutedGlobalScope); + if (script->hasNonSyntacticScope()) + scriptBits |= (1 << HasNonSyntacticScope); } if (!xdr->codeUint32(&prologueLength)) return false; if (!xdr->codeUint32(&version)) return false; // To fuse allocations, we need lengths of all embedded arrays early. @@ -844,18 +844,18 @@ js::XDRScript(XDRState<mode>* xdr, Handl if (scriptBits & (1 << NeedsArgsObj)) script->setNeedsArgsObj(true); if (scriptBits & (1 << IsGeneratorExp)) script->isGeneratorExp_ = true; if (scriptBits & (1 << HasSingleton)) script->hasSingletons_ = true; if (scriptBits & (1 << TreatAsRunOnce)) script->treatAsRunOnce_ = true; - if (scriptBits & (1 << HasPollutedGlobalScope)) - script->hasPollutedGlobalScope_ = true; + if (scriptBits & (1 << HasNonSyntacticScope)) + script->hasNonSyntacticScope_ = true; if (scriptBits & (1 << IsLegacyGenerator)) { MOZ_ASSERT(!(scriptBits & (1 << IsStarGenerator))); script->setGeneratorKind(LegacyGenerator); } else if (scriptBits & (1 << IsStarGenerator)) script->setGeneratorKind(StarGenerator); } @@ -2424,17 +2424,17 @@ JSScript::Create(ExclusiveContext* cx, H PodZero(script.get()); new (&script->bindings) Bindings; script->enclosingStaticScope_ = enclosingScope; script->savedCallerFun_ = savedCallerFun; script->initCompartment(cx); - script->hasPollutedGlobalScope_ = options.hasPollutedGlobalScope; + script->hasNonSyntacticScope_ = options.hasPollutedGlobalScope; script->selfHosted_ = options.selfHostingMode; script->noScriptRval_ = options.noScriptRval; script->treatAsRunOnce_ = options.isRunOnce; script->version = options.version; MOZ_ASSERT(script->getVersion() == options.version); // assert that no overflow occurred // This is an unsigned-to-uint16_t conversion, test for too-high values. @@ -3203,31 +3203,31 @@ js::CloneScript(JSContext* cx, HandleObj } if (ntrynotes != 0) dst->trynotes()->vector = Rebase<JSTryNote>(dst, src, src->trynotes()->vector); if (nblockscopes != 0) dst->blockScopes()->vector = Rebase<BlockScopeNote>(dst, src, src->blockScopes()->vector); /* * Function delazification assumes that their script does not have a - * polluted global scope. We ensure that as follows: + * non-syntactic global scope. We ensure that as follows: * * 1) Initial parsing only creates lazy functions if - * !hasPollutedGlobalScope. + * !hasNonSyntacticScope. * 2) Cloning a lazy function into a non-global scope will always require * that its script be cloned. See comments in * CloneFunctionObjectUseSameScript. * 3) Cloning a script never sets a lazyScript on the clone, so the function * cannot be relazified. * - * If you decide that lazy functions should be supported with a polluted - * global scope, make sure delazification can deal. + * If you decide that lazy functions should be supported with a + * non-syntactic global scope, make sure delazification can deal. */ - MOZ_ASSERT_IF(dst->hasPollutedGlobalScope(), !dst->maybeLazyScript()); - MOZ_ASSERT_IF(dst->hasPollutedGlobalScope(), !dst->isRelazifiable()); + MOZ_ASSERT_IF(dst->hasNonSyntacticScope(), !dst->maybeLazyScript()); + MOZ_ASSERT_IF(dst->hasNonSyntacticScope(), !dst->isRelazifiable()); return dst; } bool js::CloneFunctionScript(JSContext* cx, HandleFunction original, HandleFunction clone, PollutedGlobalScopeOption polluted, NewObjectKind newKind) { RootedScript script(cx, clone->nonLazyScript());
--- a/js/src/jsscript.h +++ b/js/src/jsscript.h @@ -931,17 +931,17 @@ class JSScript : public js::gc::TenuredC bool strict_:1; // Code has "use strict"; explicitly. bool explicitUseStrict_:1; // True if the script has a non-syntactic scope on its dynamic scope chain. // That is, there are objects about which we know nothing between the // outermost syntactic scope and the global. - bool hasPollutedGlobalScope_:1; + bool hasNonSyntacticScope_:1; // see Parser::selfHostingMode. bool selfHosted_:1; // See FunctionContextFlags. bool bindingsAccessedDynamically_:1; bool funHasExtensibleScope_:1; bool funNeedsDeclEnvObject_:1; @@ -1173,18 +1173,18 @@ class JSScript : public js::gc::TenuredC bool savedCallerFun() const { return savedCallerFun_; } bool strict() const { return strict_; } bool explicitUseStrict() const { return explicitUseStrict_; } - bool hasPollutedGlobalScope() const { - return hasPollutedGlobalScope_; + bool hasNonSyntacticScope() const { + return hasNonSyntacticScope_; } bool selfHosted() const { return selfHosted_; } bool bindingsAccessedDynamically() const { return bindingsAccessedDynamically_; } bool funHasExtensibleScope() const { return funHasExtensibleScope_; } bool funNeedsDeclEnvObject() const {
--- a/js/src/vm/Interpreter-inl.h +++ b/js/src/vm/Interpreter-inl.h @@ -299,19 +299,19 @@ SetAliasedVarOperation(JSContext* cx, JS inline bool SetNameOperation(JSContext* cx, JSScript* script, jsbytecode* pc, HandleObject scope, HandleValue val) { MOZ_ASSERT(*pc == JSOP_SETNAME || *pc == JSOP_STRICTSETNAME || *pc == JSOP_SETGNAME || *pc == JSOP_STRICTSETGNAME); - MOZ_ASSERT_IF(*pc == JSOP_SETGNAME && !script->hasPollutedGlobalScope(), + MOZ_ASSERT_IF(*pc == JSOP_SETGNAME && !script->hasNonSyntacticScope(), scope == cx->global()); - MOZ_ASSERT_IF(*pc == JSOP_STRICTSETGNAME && !script->hasPollutedGlobalScope(), + MOZ_ASSERT_IF(*pc == JSOP_STRICTSETGNAME && !script->hasNonSyntacticScope(), scope == cx->global()); bool strict = *pc == JSOP_STRICTSETNAME || *pc == JSOP_STRICTSETGNAME; RootedPropertyName name(cx, script->getName(pc)); // In strict mode, assigning to an undeclared global variable is an // error. To detect this, we call NativeSetProperty directly and pass // Unqualified. It stores the error, if any, in |result|.
--- a/js/src/vm/Interpreter.cpp +++ b/js/src/vm/Interpreter.cpp @@ -269,17 +269,17 @@ GetNameOperation(JSContext* cx, Interpre * Skip along the scope chain to the enclosing global object. This is * used for GNAME opcodes where the bytecode emitter has determined a * name access must be on the global. It also insulates us from bugs * in the emitter: type inference will assume that GNAME opcodes are * accessing the global object, and the inferred behavior should match * the actual behavior even if the id could be found on the scope chain * before the global object. */ - if (IsGlobalOp(JSOp(*pc)) && !fp->script()->hasPollutedGlobalScope()) + if (IsGlobalOp(JSOp(*pc)) && !fp->script()->hasNonSyntacticScope()) obj = &obj->global(); Shape* shape = nullptr; JSObject* scope = nullptr; JSObject* pobj = nullptr; if (LookupNameNoGC(cx, name, obj, &scope, &pobj, &shape)) { if (FetchNameNoGC(pobj, shape, vp)) return CheckUninitializedLexical(cx, name, vp); @@ -863,17 +863,17 @@ js::ExecuteKernel(JSContext* cx, HandleS RootedObject thisObj(cx, &thisv.toObject()); AutoSuppressGC nogc(cx); MOZ_ASSERT(GetOuterObject(cx, thisObj) == thisObj); } RootedObject terminatingScope(cx, &scopeChainArg); while (IsSyntacticScope(terminatingScope)) terminatingScope = terminatingScope->enclosingScope(); MOZ_ASSERT(terminatingScope->is<GlobalObject>() || - script->hasPollutedGlobalScope()); + script->hasNonSyntacticScope()); #endif if (script->treatAsRunOnce()) { if (script->hasRunOnce()) { JS_ReportError(cx, "Trying to execute a run-once script multiple times"); return false; } @@ -899,18 +899,18 @@ js::ExecuteKernel(JSContext* cx, HandleS bool js::Execute(JSContext* cx, HandleScript script, JSObject& scopeChainArg, Value* rval) { /* The scope chain is something we control, so we know it can't have any outer objects on it. */ RootedObject scopeChain(cx, &scopeChainArg); MOZ_ASSERT(scopeChain == GetInnerObject(scopeChain)); - MOZ_RELEASE_ASSERT(scopeChain->is<GlobalObject>() || script->hasPollutedGlobalScope(), - "Only scripts with polluted scopes can be executed with " + MOZ_RELEASE_ASSERT(scopeChain->is<GlobalObject>() || script->hasNonSyntacticScope(), + "Only scripts with non-syntactic scopes can be executed with " "interesting scopechains"); /* Ensure the scope chain is all same-compartment and terminates in a global. */ #ifdef DEBUG JSObject* s = scopeChain; do { assertSameCompartment(cx, s); MOZ_ASSERT_IF(!s->enclosingScope(), s->is<GlobalObject>()); @@ -2315,17 +2315,17 @@ END_CASE(JSOP_SETCONST) CASE(JSOP_BINDINTRINSIC) PUSH_OBJECT(*cx->global()->intrinsicsHolder()); END_CASE(JSOP_BINDINTRINSIC) CASE(JSOP_BINDGNAME) CASE(JSOP_BINDNAME) { JSOp op = JSOp(*REGS.pc); - if (op == JSOP_BINDNAME || script->hasPollutedGlobalScope()) { + if (op == JSOP_BINDNAME || script->hasNonSyntacticScope()) { ReservedRooted<JSObject*> scopeChain(&rootObject0, REGS.fp()->scopeChain()); ReservedRooted<PropertyName*> name(&rootName0, script->getName(REGS.pc)); /* Assigning to an undeclared name adds a property to the global object. */ ReservedRooted<JSObject*> scope(&rootObject1); if (!LookupNameUnqualified(cx, name, scopeChain, &scope)) goto error; @@ -3057,17 +3057,17 @@ CASE(JSOP_THROWMSG) goto error; } END_CASE(JSOP_THROWMSG) CASE(JSOP_IMPLICITTHIS) CASE(JSOP_GIMPLICITTHIS) { JSOp op = JSOp(*REGS.pc); - if (op == JSOP_IMPLICITTHIS || script->hasPollutedGlobalScope()) { + if (op == JSOP_IMPLICITTHIS || script->hasNonSyntacticScope()) { ReservedRooted<PropertyName*> name(&rootName0, script->getName(REGS.pc)); ReservedRooted<JSObject*> scopeObj(&rootObject0, REGS.fp()->scopeChain()); ReservedRooted<JSObject*> scope(&rootObject1); if (!LookupNameWithGlobalDefault(cx, name, scopeObj, &scope)) goto error; ReservedRooted<Value> v(&rootValue0); if (!ComputeImplicitThis(cx, scope, &v))
--- a/js/src/vm/Opcodes.h +++ b/js/src/vm/Opcodes.h @@ -1565,47 +1565,47 @@ 1234567890123456789012345678901234567890 * Category: Statements * Type: Function * Operands: * Stack: => */ \ macro(JSOP_RETRVAL, 153,"retrval", NULL, 1, 0, 0, JOF_BYTE) \ \ /* - * Looks up name on global scope and pushes its value onto the stack, unless - * the script has a polluted global, in which case it acts just like - * JSOP_NAME. + * Looks up name on global scope and pushes its value onto the stack, + * unless the script has a non-syntactic global scope, in which case it + * acts just like JSOP_NAME. * * Free variable references that must either be found on the global or a * ReferenceError. * Category: Variables and Scopes * Type: Free Variables * Operands: uint32_t nameIndex * Stack: => val */ \ macro(JSOP_GETGNAME, 154,"getgname", NULL, 5, 0, 1, JOF_ATOM|JOF_NAME|JOF_TYPESET|JOF_GNAME) \ /* * Pops the top two values on the stack as 'val' and 'scope', sets property * of 'scope' as 'val' and pushes 'val' back on the stack. * - * 'scope' should be the global scope unless the script has a polluted + * 'scope' should be the global scope unless the script has a non-syntactic * global scope, in which case acts like JSOP_SETNAME. * Category: Variables and Scopes * Type: Free Variables * Operands: uint32_t nameIndex * Stack: scope, val => val */ \ macro(JSOP_SETGNAME, 155,"setgname", NULL, 5, 2, 1, JOF_ATOM|JOF_NAME|JOF_SET|JOF_DETECTING|JOF_GNAME|JOF_CHECKSLOPPY) \ \ /* * Pops the top two values on the stack as 'val' and 'scope', sets property * of 'scope' as 'val' and pushes 'val' back on the stack. Throws a * TypeError if the set fails, per strict mode semantics. * - * 'scope' should be the global scope unless the script has a polluted + * 'scope' should be the global scope unless the script has a non-syntactic * global scope, in which case acts like JSOP_STRICTSETNAME. * Category: Variables and Scopes * Type: Free Variables * Operands: uint32_t nameIndex * Stack: scope, val => val */ \ macro(JSOP_STRICTSETGNAME, 156, "strict-setgname", NULL, 5, 2, 1, JOF_ATOM|JOF_NAME|JOF_SET|JOF_DETECTING|JOF_GNAME|JOF_CHECKSTRICT) \ /* @@ -1866,17 +1866,17 @@ 1234567890123456789012345678901234567890 macro(JSOP_DEBUGAFTERYIELD, 208, "debugafteryield", NULL, 1, 0, 0, JOF_BYTE) \ macro(JSOP_UNUSED209, 209, "unused209", NULL, 1, 0, 0, JOF_BYTE) \ macro(JSOP_UNUSED210, 210, "unused210", NULL, 1, 0, 0, JOF_BYTE) \ macro(JSOP_UNUSED211, 211, "unused211", NULL, 1, 0, 0, JOF_BYTE) \ macro(JSOP_UNUSED212, 212, "unused212", NULL, 1, 0, 0, JOF_BYTE) \ macro(JSOP_UNUSED213, 213, "unused213", NULL, 1, 0, 0, JOF_BYTE) \ /* * Pushes the global scope onto the stack if the script doesn't have a - * polluted global scope. Otherwise will act like JSOP_BINDNAME. + * non-syntactic global scope. Otherwise will act like JSOP_BINDNAME. * * 'nameIndex' is only used when acting like JSOP_BINDNAME. * Category: Variables and Scopes * Type: Free Variables * Operands: uint32_t nameIndex * Stack: => global */ \ macro(JSOP_BINDGNAME, 214, "bindgname", NULL, 5, 0, 1, JOF_ATOM|JOF_NAME|JOF_SET|JOF_GNAME) \
--- a/js/src/vm/ScopeObject.cpp +++ b/js/src/vm/ScopeObject.cpp @@ -2516,17 +2516,17 @@ RemoveReferencedNames(JSContext* cx, Han case JSOP_SETNAME: case JSOP_STRICTSETNAME: name = script->getName(pc); break; case JSOP_GETGNAME: case JSOP_SETGNAME: case JSOP_STRICTSETGNAME: - if (script->hasPollutedGlobalScope()) + if (script->hasNonSyntacticScope()) name = script->getName(pc); else name = nullptr; break; case JSOP_GETALIASEDVAR: case JSOP_SETALIASEDVAR: name = ScopeCoordinateName(cx->runtime()->scopeCoordinateNameCache, script, pc);