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

Unified Diff: src/ast/scopes.cc

Issue 2425633002: Separate scope info allocation for the debugger from regular allocation (Closed)
Patch Set: Restore allocation of function scope infos 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 030719ee16665d51b0c67cb32a75e2a6fbc77640..d7decb04bf01d96bd7c1b052232af5d39094babd 100644
--- a/src/ast/scopes.cc
+++ b/src/ast/scopes.cc
@@ -1092,7 +1092,10 @@ void DeclarationScope::AllocateVariables(ParseInfo* info, AnalyzeMode mode) {
outer_scope = s->scope_info_;
break;
}
- AllocateScopeInfosRecursively(info->isolate(), mode, outer_scope);
+ AllocateScopeInfosRecursively(info->isolate(), outer_scope);
+ if (mode == AnalyzeMode::kDebugger) {
+ AllocateDebuggerScopeInfos(info->isolate(), outer_scope);
+ }
// The debugger expects all shared function infos to contain a scope info.
// Since the top-most scope will end up in a shared function info, make sure
// it has one, even if it doesn't need a scope info.
@@ -1194,9 +1197,7 @@ DeclarationScope* Scope::GetClosureScope() {
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;
+ DCHECK(GetClosureScope()->ShouldEagerCompile());
// The debugger expects all functions to have scope infos.
// TODO(jochen|yangguo): Remove this requirement.
if (is_function_scope()) return true;
@@ -1929,26 +1930,36 @@ void Scope::AllocateVariablesRecursively() {
DCHECK(num_heap_slots_ == 0 || num_heap_slots_ >= Context::MIN_CONTEXT_SLOTS);
}
-void Scope::AllocateScopeInfosRecursively(Isolate* isolate, AnalyzeMode mode,
+void Scope::AllocateScopeInfosRecursively(Isolate* isolate,
MaybeHandle<ScopeInfo> outer_scope) {
DCHECK(scope_info_.is_null());
- if (mode == AnalyzeMode::kDebugger || NeedsScopeInfo()) {
+ MaybeHandle<ScopeInfo> next_outer_scope = outer_scope;
+
+ if (NeedsScopeInfo()) {
scope_info_ = ScopeInfo::Create(isolate, zone(), this, outer_scope);
+ // The ScopeInfo chain should mirror the context chain, so we only link to
+ // the next outer scope that needs a context.
+ if (NeedsContext()) next_outer_scope = scope_info_;
}
- // The ScopeInfo chain should mirror the context chain, so we only link to
- // the next outer scope that needs a context.
- MaybeHandle<ScopeInfo> next_outer_scope = outer_scope;
- if (NeedsContext()) next_outer_scope = scope_info_;
-
// Allocate ScopeInfos for inner scopes.
for (Scope* scope = inner_scope_; scope != nullptr; scope = scope->sibling_) {
- // 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);
+ if (!scope->is_function_scope() ||
+ scope->AsDeclarationScope()->ShouldEagerCompile()) {
+ scope->AllocateScopeInfosRecursively(isolate, next_outer_scope);
+ }
+ }
+}
+
+void Scope::AllocateDebuggerScopeInfos(Isolate* isolate,
+ MaybeHandle<ScopeInfo> outer_scope) {
+ if (scope_info_.is_null()) {
+ scope_info_ = ScopeInfo::Create(isolate, zone(), this, outer_scope);
+ }
+ MaybeHandle<ScopeInfo> outer = NeedsContext() ? scope_info_ : outer_scope;
+ for (Scope* scope = inner_scope_; scope != nullptr; scope = scope->sibling_) {
+ if (scope->is_function_scope()) continue;
+ scope->AllocateDebuggerScopeInfos(isolate, outer);
}
}
« 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