Index: src/ast/scopes.cc |
diff --git a/src/ast/scopes.cc b/src/ast/scopes.cc |
index 372ab769de518e1aeab8e309116e1bd6c87f69b6..0002fe783ea216877406fa015fbc54e0e4bdb98d 100644 |
--- a/src/ast/scopes.cc |
+++ b/src/ast/scopes.cc |
@@ -214,7 +214,6 @@ void Scope::SetDefaults() { |
is_hidden_ = false; |
is_debug_evaluate_scope_ = false; |
- outer_scope_calls_sloppy_eval_ = false; |
inner_scope_calls_eval_ = false; |
force_eager_compilation_ = false; |
force_context_allocation_ = false; |
@@ -297,7 +296,7 @@ Scope* Scope::DeserializeScopeChain(Isolate* isolate, Zone* zone, |
} |
script_scope->AddInnerScope(current_scope); |
- script_scope->PropagateScopeInfo(false); |
+ script_scope->PropagateScopeInfo(); |
return (innermost_scope == NULL) ? script_scope : innermost_scope; |
} |
@@ -864,13 +863,7 @@ void Scope::CollectStackAndContextLocals(ZoneList<Variable*>* stack_locals, |
void DeclarationScope::AllocateVariables(ParseInfo* info, |
AstNodeFactory* factory) { |
// 1) Propagate scope information. |
- bool outer_scope_calls_sloppy_eval = false; |
- if (outer_scope_ != NULL) { |
- outer_scope_calls_sloppy_eval = |
- outer_scope_->outer_scope_calls_sloppy_eval() | |
- outer_scope_->calls_sloppy_eval(); |
- } |
- PropagateScopeInfo(outer_scope_calls_sloppy_eval); |
+ PropagateScopeInfo(); |
// 2) Resolve variables. |
ResolveVariablesRecursively(info, factory); |
@@ -905,16 +898,27 @@ bool Scope::AllowsLazyCompilationWithoutContext() const { |
return true; |
} |
- |
-int Scope::ContextChainLength(Scope* scope) { |
+int Scope::ContextChainLength(Scope* scope) const { |
int n = 0; |
- for (Scope* s = this; s != scope; s = s->outer_scope_) { |
+ for (const Scope* s = this; s != scope; s = s->outer_scope_) { |
DCHECK(s != NULL); // scope must be in the scope chain |
if (s->NeedsContext()) n++; |
} |
return n; |
} |
+int Scope::ContextChainLengthUntilOutermostSloppyEval() const { |
+ int result = 0; |
+ int length = 0; |
+ |
+ for (const Scope* s = this; s != nullptr; s = s->outer_scope()) { |
+ if (!s->NeedsContext()) continue; |
+ length++; |
+ if (s->calls_sloppy_eval()) result = length; |
+ } |
+ |
+ return result; |
+} |
int Scope::MaxNestedContextChainLength() { |
int max_context_chain_length = 0; |
@@ -976,7 +980,7 @@ Handle<StringSet> DeclarationScope::CollectNonLocals( |
void DeclarationScope::AnalyzePartially(DeclarationScope* migrate_to, |
AstNodeFactory* ast_node_factory) { |
// Gather info from inner scopes. |
- PropagateScopeInfo(false); |
+ PropagateScopeInfo(); |
// Try to resolve unresolved variables for this Scope and migrate those which |
// cannot be resolved inside. It doesn't make sense to try to resolve them in |
@@ -1154,9 +1158,6 @@ void Scope::Print(int n) { |
if (scope_calls_eval_) Indent(n1, "// scope calls 'eval'\n"); |
if (scope_uses_super_property_) |
Indent(n1, "// scope uses 'super' property\n"); |
- if (outer_scope_calls_sloppy_eval_) { |
- Indent(n1, "// outer scope calls 'eval' in sloppy context\n"); |
- } |
if (inner_scope_calls_eval_) Indent(n1, "// inner scope calls 'eval'\n"); |
if (num_stack_slots_ > 0) { |
Indent(n1, "// "); |
@@ -1464,15 +1465,9 @@ VariableProxy* Scope::FetchFreeVariables(DeclarationScope* max_outer_scope, |
return stack; |
} |
-void Scope::PropagateScopeInfo(bool outer_scope_calls_sloppy_eval) { |
- if (outer_scope_calls_sloppy_eval) { |
- outer_scope_calls_sloppy_eval_ = true; |
- } |
- |
- bool calls_sloppy_eval = |
- this->calls_sloppy_eval() || outer_scope_calls_sloppy_eval_; |
+void Scope::PropagateScopeInfo() { |
for (Scope* inner = inner_scope_; inner != nullptr; inner = inner->sibling_) { |
- inner->PropagateScopeInfo(calls_sloppy_eval); |
+ inner->PropagateScopeInfo(); |
if (inner->scope_calls_eval_ || inner->inner_scope_calls_eval_) { |
inner_scope_calls_eval_ = true; |
} |