Index: src/ast/scopes.cc |
diff --git a/src/ast/scopes.cc b/src/ast/scopes.cc |
index e7b785546e25fe4d684c444084ef970c32c01bd5..293506e4cd5c67ef93bc10404f1d23d9d12b4223 100644 |
--- a/src/ast/scopes.cc |
+++ b/src/ast/scopes.cc |
@@ -303,6 +303,7 @@ void Scope::SetDefaults() { |
is_declaration_scope_ = false; |
is_lazily_parsed_ = false; |
+ should_eager_compile_ = false; |
} |
bool Scope::HasSimpleParameters() { |
@@ -310,6 +311,22 @@ bool Scope::HasSimpleParameters() { |
return !scope->is_function_scope() || scope->has_simple_parameters(); |
} |
+bool Scope::ShouldEagerCompile() const { |
+ if (is_declaration_scope() && |
+ !AsDeclarationScope()->AllowsLazyCompilation()) { |
+ return true; |
+ } |
+ return !is_lazily_parsed_ && should_eager_compile_; |
+} |
+ |
+void Scope::SetShouldEagerCompile() { |
+ should_eager_compile_ = true; |
+ for (Scope* inner = inner_scope_; inner != nullptr; inner = inner->sibling_) { |
+ if (inner->is_function_scope()) continue; |
+ inner->SetShouldEagerCompile(); |
+ } |
+} |
+ |
void DeclarationScope::set_asm_module() { |
asm_module_ = true; |
// Mark any existing inner function scopes as asm function scopes. |
@@ -552,6 +569,9 @@ void DeclarationScope::Analyze(ParseInfo* info, AnalyzeMode mode) { |
scope->outer_scope()->scope_type() == SCRIPT_SCOPE || |
scope->outer_scope()->already_resolved_); |
+ // The outer scope is never lazy. |
+ scope->SetShouldEagerCompile(); |
+ |
scope->AllocateVariables(info, mode); |
// Ensuring that the outer script scope has a scope info avoids having |
@@ -1415,6 +1435,7 @@ void Scope::Print(int n) { |
} |
if (inner_scope_calls_eval_) Indent(n1, "// inner scope calls 'eval'\n"); |
if (is_lazily_parsed_) Indent(n1, "// lazily parsed\n"); |
+ if (should_eager_compile_) Indent(n1, "// will be compiled\n"); |
if (num_stack_slots_ > 0) { |
Indent(n1, "// "); |
PrintF("%d stack slots\n", num_stack_slots_); |
@@ -1894,7 +1915,21 @@ void Scope::AllocateScopeInfosRecursively(Isolate* isolate, AnalyzeMode mode, |
// Allocate ScopeInfos for inner scopes. |
for (Scope* scope = inner_scope_; scope != nullptr; scope = scope->sibling_) { |
- scope->AllocateScopeInfosRecursively(isolate, mode, next_outer_scope); |
+ AnalyzeMode next_mode = mode; |
+ bool next_eager = should_eager_compile_; |
+ if (scope->is_function_scope()) { |
+ // Make sure all inner scopes have are consistently marked: we can't |
+ // eager compile inner functions of lazy functions, but if a function |
+ // should be eagerly compiled, all its inner scopes are compiled as well. |
+ next_eager = should_eager_compile_ ? scope->ShouldEagerCompile() : false; |
+ |
+ // The ScopeIterator which uses the AnalyzeMode::kDebugger only expects |
+ // to find ScopeInfos for the current function and all its inner |
+ // non-function scopes (see ScopeIterator::GetNestedScopeChain). |
+ next_mode = AnalyzeMode::kRegular; |
+ } |
+ scope->should_eager_compile_ = next_eager; |
+ scope->AllocateScopeInfosRecursively(isolate, next_mode, next_outer_scope); |
} |
} |