Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(53)

Unified Diff: src/ast/scopes.cc

Issue 2423883002: Move should_eager_compile and is_lazily_parsed to DeclarationScope (Closed)
Patch Set: Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/ast/scopes.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/ast/scopes.cc
diff --git a/src/ast/scopes.cc b/src/ast/scopes.cc
index ecdba315a699a17dd27195c36362440eb13dee34..030719ee16665d51b0c67cb32a75e2a6fbc77640 100644
--- a/src/ast/scopes.cc
+++ b/src/ast/scopes.cc
@@ -271,6 +271,8 @@ void DeclarationScope::SetDefaults() {
function_ = nullptr;
arguments_ = nullptr;
this_function_ = nullptr;
+ should_eager_compile_ = false;
+ is_lazily_parsed_ = false;
}
void Scope::SetDefaults() {
@@ -300,9 +302,6 @@ void Scope::SetDefaults() {
force_context_allocation_ = false;
is_declaration_scope_ = false;
-
- is_lazily_parsed_ = false;
- should_eager_compile_ = false;
}
bool Scope::HasSimpleParameters() {
@@ -310,20 +309,13 @@ bool Scope::HasSimpleParameters() {
return !scope->is_function_scope() || scope->has_simple_parameters();
}
-bool Scope::ShouldEagerCompile() const {
- if (is_declaration_scope() &&
- !AsDeclarationScope()->AllowsLazyCompilation()) {
- return true;
- }
+bool DeclarationScope::ShouldEagerCompile() const {
+ if (!AllowsLazyCompilation()) return true;
return !is_lazily_parsed_ && should_eager_compile_;
}
-void Scope::SetShouldEagerCompile() {
+void DeclarationScope::set_should_eager_compile() {
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() {
@@ -569,7 +561,7 @@ void DeclarationScope::Analyze(ParseInfo* info, AnalyzeMode mode) {
scope->outer_scope()->already_resolved_);
// The outer scope is never lazy.
- scope->SetShouldEagerCompile();
+ scope->set_should_eager_compile();
scope->AllocateVariables(info, mode);
@@ -1184,6 +1176,14 @@ DeclarationScope* Scope::GetDeclarationScope() {
return scope->AsDeclarationScope();
}
+const DeclarationScope* Scope::GetClosureScope() const {
+ const Scope* scope = this;
+ while (!scope->is_declaration_scope() || scope->is_block_scope()) {
+ scope = scope->outer_scope();
+ }
+ return scope->AsDeclarationScope();
+}
+
DeclarationScope* Scope::GetClosureScope() {
Scope* scope = this;
while (!scope->is_declaration_scope() || scope->is_block_scope()) {
@@ -1192,6 +1192,17 @@ DeclarationScope* Scope::GetClosureScope() {
return scope->AsDeclarationScope();
}
+bool Scope::NeedsScopeInfo() const {
+ DCHECK(!already_resolved_);
+ // A lazily parsed scope doesn't contain enough information to create a
+ // ScopeInfo from it.
+ if (!GetClosureScope()->ShouldEagerCompile()) return false;
+ // The debugger expects all functions to have scope infos.
+ // TODO(jochen|yangguo): Remove this requirement.
+ if (is_function_scope()) return true;
+ return NeedsContext();
+}
+
ModuleScope* Scope::GetModuleScope() {
Scope* scope = this;
DCHECK(!scope->is_script_scope());
@@ -1446,8 +1457,11 @@ void Scope::Print(int n) {
Indent(n1, "// scope uses 'super' property\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 (is_declaration_scope()) {
+ DeclarationScope* scope = AsDeclarationScope();
+ if (scope->is_lazily_parsed()) Indent(n1, "// lazily parsed\n");
+ if (scope->ShouldEagerCompile()) Indent(n1, "// will be compiled\n");
+ }
if (num_stack_slots_ > 0) {
Indent(n1, "// ");
PrintF("%d stack slots\n", num_stack_slots_);
@@ -1872,7 +1886,9 @@ void Scope::AllocateVariablesRecursively() {
DCHECK(!already_resolved_);
DCHECK_EQ(0, num_stack_slots_);
// Don't allocate variables of preparsed scopes.
- if (is_lazily_parsed_) return;
+ if (is_declaration_scope() && AsDeclarationScope()->is_lazily_parsed()) {
+ return;
+ }
// Allocate variables for inner scopes.
for (Scope* scope = inner_scope_; scope != nullptr; scope = scope->sibling_) {
@@ -1927,20 +1943,11 @@ void Scope::AllocateScopeInfosRecursively(Isolate* isolate, AnalyzeMode mode,
// Allocate ScopeInfos for inner scopes.
for (Scope* scope = inner_scope_; scope != nullptr; scope = scope->sibling_) {
- 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;
+ // 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).
+ AnalyzeMode next_mode =
+ scope->is_function_scope() ? AnalyzeMode::kRegular : mode;
scope->AllocateScopeInfosRecursively(isolate, next_mode, next_outer_scope);
}
}
« no previous file with comments | « src/ast/scopes.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698