Bug 1165486 - Detect with scopes at parse time using the static scope chain instead of treating it as a polluted global. (r=luke)

This commit is contained in:
Shu-yu Guo 2015-06-15 17:38:01 -07:00
parent 3c634f08a1
commit fdea290a47
2 changed files with 17 additions and 0 deletions

View File

@ -634,6 +634,15 @@ FunctionBox::FunctionBox(ExclusiveContext* cx, ObjectBox* traceListHead, JSFunct
FunctionBox* parent = outerpc->sc->asFunctionBox();
if (parent && parent->inWith)
inWith = true;
} else {
// This is like the above case, but when inside eval.
//
// For example:
//
// with(o) { eval("(function() { g(); })();"); }
//
// In this case, the static scope chain tells us the presence of with.
inWith = outerpc->sc->asGlobalSharedContext()->inWith();
}
}

View File

@ -280,6 +280,14 @@ class GlobalSharedContext : public SharedContext
}
return false;
}
bool inWith() const {
for (StaticScopeIter<CanGC> it(context, topStaticScope_); !it.done(); it++) {
if (it.type() == StaticScopeIter<CanGC>::With)
return true;
}
return false;
}
};
class FunctionBox : public ObjectBox, public SharedContext