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

Unified Diff: src/ast/scopes.cc

Issue 2270743002: Scopes: simplfy scope creation for with scopes. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: leaner version Created 4 years, 4 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 fbc29609fd06ef80a112e561e69f78ae42789286..310fabad0807bb6f13dd9e56d9187b573b538105 100644
--- a/src/ast/scopes.cc
+++ b/src/ast/scopes.cc
@@ -77,14 +77,20 @@ void SloppyBlockFunctionMap::Declare(Zone* zone, const AstRawString* name,
// ----------------------------------------------------------------------------
// Implementation of Scope
-Scope::Scope(Zone* zone)
+Scope::Scope(Zone* zone, ScopeType scope_type)
: zone_(zone),
outer_scope_(nullptr),
variables_(zone),
ordered_variables_(4, zone),
decls_(4, zone),
- scope_type_(SCRIPT_SCOPE) {
+ scope_type_(scope_type) {
+ DCHECK(scope_type == SCRIPT_SCOPE || scope_type == WITH_SCOPE);
SetDefaults();
+#ifdef DEBUG
+ if (scope_type == WITH_SCOPE) {
+ already_resolved_ = true;
+ }
+#endif
}
Scope::Scope(Zone* zone, Scope* outer_scope, ScopeType scope_type)
@@ -137,8 +143,7 @@ ModuleScope::ModuleScope(Zone* zone, DeclarationScope* script_scope,
DeclareThis(ast_value_factory);
}
-Scope::Scope(Zone* zone, Scope* inner_scope, ScopeType scope_type,
- Handle<ScopeInfo> scope_info)
+Scope::Scope(Zone* zone, ScopeType scope_type, Handle<ScopeInfo> scope_info)
: zone_(zone),
outer_scope_(nullptr),
variables_(zone),
@@ -146,26 +151,20 @@ Scope::Scope(Zone* zone, Scope* inner_scope, ScopeType scope_type,
decls_(0, zone),
scope_info_(scope_info),
scope_type_(scope_type) {
+ DCHECK(!scope_info.is_null());
SetDefaults();
#ifdef DEBUG
already_resolved_ = true;
#endif
- if (scope_type == WITH_SCOPE) {
- DCHECK(scope_info.is_null());
- } else {
- if (scope_info->CallsEval()) RecordEvalCall();
- set_language_mode(scope_info->language_mode());
- num_heap_slots_ = scope_info->ContextLength();
- }
+ if (scope_info->CallsEval()) RecordEvalCall();
+ set_language_mode(scope_info->language_mode());
+ num_heap_slots_ = scope_info->ContextLength();
DCHECK_LE(Context::MIN_CONTEXT_SLOTS, num_heap_slots_);
-
- if (inner_scope != nullptr) AddInnerScope(inner_scope);
}
-DeclarationScope::DeclarationScope(Zone* zone, Scope* inner_scope,
- ScopeType scope_type,
+DeclarationScope::DeclarationScope(Zone* zone, ScopeType scope_type,
Handle<ScopeInfo> scope_info)
- : Scope(zone, inner_scope, scope_type, scope_info),
+ : Scope(zone, scope_type, scope_info),
function_kind_(scope_info->function_kind()),
temps_(0, zone),
params_(0, zone),
@@ -173,8 +172,7 @@ DeclarationScope::DeclarationScope(Zone* zone, Scope* inner_scope,
SetDefaults();
}
-Scope::Scope(Zone* zone, Scope* inner_scope,
- const AstRawString* catch_variable_name)
+Scope::Scope(Zone* zone, const AstRawString* catch_variable_name)
: zone_(zone),
outer_scope_(nullptr),
variables_(zone),
@@ -185,7 +183,6 @@ Scope::Scope(Zone* zone, Scope* inner_scope,
#ifdef DEBUG
already_resolved_ = true;
#endif
- if (inner_scope != nullptr) AddInnerScope(inner_scope);
Variable* variable =
variables_.Declare(zone, this, catch_variable_name, VAR, Variable::NORMAL,
kCreatedInitialized);
@@ -260,17 +257,17 @@ Scope* Scope::DeserializeScopeChain(Isolate* isolate, Zone* zone,
// Reconstruct the outer scope chain from a closure's context chain.
Scope* current_scope = nullptr;
Scope* innermost_scope = nullptr;
+ Scope* outer_scope = nullptr;
while (!context->IsNativeContext()) {
if (context->IsWithContext() || context->IsDebugEvaluateContext()) {
// For scope analysis, debug-evaluate is equivalent to a with scope.
- Scope* with_scope = new (zone)
- Scope(zone, current_scope, WITH_SCOPE, Handle<ScopeInfo>());
+ outer_scope = new (zone) Scope(zone, WITH_SCOPE);
+
// TODO(yangguo): Remove once debug-evaluate properly keeps track of the
// function scope in which we are evaluating.
if (context->IsDebugEvaluateContext()) {
- with_scope->set_is_debug_evaluate_scope();
+ outer_scope->set_is_debug_evaluate_scope();
}
- current_scope = with_scope;
} else if (context->IsScriptContext()) {
// If we reach a script context, it's the outermost context with scope
// info. The next context will be the native context. Install the scope
@@ -288,28 +285,31 @@ Scope* Scope::DeserializeScopeChain(Isolate* isolate, Zone* zone,
// https://bugs.chromium.org/p/v8/issues/detail?id=5295
DCHECK(scope_info->scope_type() == FUNCTION_SCOPE ||
scope_info->scope_type() == EVAL_SCOPE);
- DeclarationScope* function_scope = new (zone)
- DeclarationScope(zone, current_scope, FUNCTION_SCOPE, scope_info);
- if (scope_info->IsAsmFunction()) function_scope->set_asm_function();
- if (scope_info->IsAsmModule()) function_scope->set_asm_module();
- current_scope = function_scope;
+ outer_scope =
+ new (zone) DeclarationScope(zone, FUNCTION_SCOPE, scope_info);
+ if (scope_info->IsAsmFunction())
+ outer_scope->AsDeclarationScope()->set_asm_function();
+ if (scope_info->IsAsmModule())
+ outer_scope->AsDeclarationScope()->set_asm_module();
} else if (context->IsBlockContext()) {
Handle<ScopeInfo> scope_info(context->scope_info(), isolate);
DCHECK_EQ(scope_info->scope_type(), BLOCK_SCOPE);
if (scope_info->is_declaration_scope()) {
- current_scope = new (zone)
- DeclarationScope(zone, current_scope, BLOCK_SCOPE, scope_info);
+ outer_scope =
+ new (zone) DeclarationScope(zone, BLOCK_SCOPE, scope_info);
} else {
- current_scope =
- new (zone) Scope(zone, current_scope, BLOCK_SCOPE, scope_info);
+ outer_scope = new (zone) Scope(zone, BLOCK_SCOPE, scope_info);
}
} else {
DCHECK(context->IsCatchContext());
String* name = context->catch_name();
- current_scope =
- new (zone) Scope(zone, current_scope,
- ast_value_factory->GetString(handle(name, isolate)));
+ outer_scope = new (zone)
+ Scope(zone, ast_value_factory->GetString(handle(name, isolate)));
+ }
+ if (current_scope != nullptr) {
+ outer_scope->AddInnerScope(current_scope);
}
+ current_scope = outer_scope;
if (deserialization_mode == DeserializationMode::kDeserializeOffHeap) {
current_scope->DeserializeScopeInfo(isolate, ast_value_factory);
}
« 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