Index: src/ast/scopes.cc |
diff --git a/src/ast/scopes.cc b/src/ast/scopes.cc |
index cb07ba901e9770668d2f2c2ec0a69d76128b5ad9..d45b02091cd805d1b0e5ec8fad07f651cac2ca7b 100644 |
--- a/src/ast/scopes.cc |
+++ b/src/ast/scopes.cc |
@@ -308,7 +308,7 @@ bool Scope::IsAsmFunction() const { |
} |
Scope* Scope::DeserializeScopeChain(Isolate* isolate, Zone* zone, |
- Context* context, |
+ ScopeInfo* scope_info, |
DeclarationScope* script_scope, |
AstValueFactory* ast_value_factory, |
DeserializationMode deserialization_mode) { |
@@ -316,93 +316,68 @@ Scope* Scope::DeserializeScopeChain(Isolate* isolate, Zone* zone, |
Scope* current_scope = nullptr; |
Scope* innermost_scope = nullptr; |
Scope* outer_scope = nullptr; |
- while (!context->IsNativeContext()) { |
- if (context->IsWithContext() || context->IsDebugEvaluateContext()) { |
+ while (scope_info) { |
+ if (scope_info->scope_type() == WITH_SCOPE) { |
// For scope analysis, debug-evaluate is equivalent to a with scope. |
- outer_scope = new (zone) |
- Scope(zone, WITH_SCOPE, Handle<ScopeInfo>(context->scope_info())); |
+ outer_scope = new (zone) Scope(zone, WITH_SCOPE, handle(scope_info)); |
// TODO(yangguo): Remove once debug-evaluate properly keeps track of the |
// function scope in which we are evaluating. |
- if (context->IsDebugEvaluateContext()) { |
+ if (scope_info->IsDebugEvaluateScope()) { |
outer_scope->set_is_debug_evaluate_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 |
- // info of this script context onto the existing script scope to avoid |
- // nesting script scopes. |
- Handle<ScopeInfo> scope_info(context->scope_info(), isolate); |
+ } else if (scope_info->scope_type() == SCRIPT_SCOPE) { |
+ // If we reach a script scope, it's the outermost scope. Install the |
+ // scope info of this script context onto the existing script scope to |
+ // avoid nesting script scopes. |
if (deserialization_mode == DeserializationMode::kIncludingVariables) { |
- script_scope->SetScriptScopeInfo(scope_info); |
+ script_scope->SetScriptScopeInfo(handle(scope_info)); |
} |
- DCHECK(context->previous()->IsNativeContext()); |
+ DCHECK(!scope_info->HasOuterScopeInfo()); |
break; |
- } else if (context->IsFunctionContext()) { |
- Handle<ScopeInfo> scope_info(context->scope_info(), isolate); |
+ } else if (scope_info->scope_type() == FUNCTION_SCOPE || |
+ scope_info->scope_type() == EVAL_SCOPE) { |
// TODO(neis): For an eval scope, we currently create an ordinary function |
// context. This is wrong and needs to be fixed. |
// https://bugs.chromium.org/p/v8/issues/detail?id=5295 |
- DCHECK(scope_info->scope_type() == FUNCTION_SCOPE || |
- scope_info->scope_type() == EVAL_SCOPE); |
outer_scope = |
- new (zone) DeclarationScope(zone, FUNCTION_SCOPE, scope_info); |
+ new (zone) DeclarationScope(zone, FUNCTION_SCOPE, handle(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); |
+ } else if (scope_info->scope_type() == BLOCK_SCOPE) { |
if (scope_info->is_declaration_scope()) { |
outer_scope = |
- new (zone) DeclarationScope(zone, BLOCK_SCOPE, scope_info); |
+ new (zone) DeclarationScope(zone, BLOCK_SCOPE, handle(scope_info)); |
} else { |
- outer_scope = new (zone) Scope(zone, BLOCK_SCOPE, scope_info); |
+ outer_scope = new (zone) Scope(zone, BLOCK_SCOPE, handle(scope_info)); |
} |
- } else if (context->IsModuleContext()) { |
- ScopeInfo* scope_info = context->scope_info(); |
- DCHECK_EQ(scope_info->scope_type(), MODULE_SCOPE); |
- outer_scope = new (zone) ModuleScope( |
- isolate, Handle<ScopeInfo>(scope_info), ast_value_factory); |
+ } else if (scope_info->scope_type() == MODULE_SCOPE) { |
+ outer_scope = new (zone) |
+ ModuleScope(isolate, handle(scope_info), ast_value_factory); |
} else { |
- DCHECK(context->IsCatchContext()); |
- String* name = context->catch_name(); |
+ DCHECK_EQ(scope_info->scope_type(), CATCH_SCOPE); |
+ DCHECK_EQ(scope_info->LocalCount(), 1); |
+ String* name = scope_info->LocalName(0); |
outer_scope = new (zone) |
Scope(zone, ast_value_factory->GetString(handle(name, isolate)), |
- Handle<ScopeInfo>(context->scope_info())); |
+ handle(scope_info)); |
} |
if (deserialization_mode == DeserializationMode::kScopesOnly) { |
outer_scope->scope_info_ = Handle<ScopeInfo>::null(); |
} |
if (current_scope != nullptr) { |
outer_scope->AddInnerScope(current_scope); |
- DCHECK_IMPLIES( |
- deserialization_mode == DeserializationMode::kIncludingVariables, |
- current_scope->scope_info_->HasOuterScopeInfo()); |
- DCHECK_IMPLIES( |
- deserialization_mode == DeserializationMode::kIncludingVariables, |
- outer_scope->scope_info_->Equals( |
- current_scope->scope_info_->OuterScopeInfo())); |
} |
current_scope = outer_scope; |
if (innermost_scope == nullptr) innermost_scope = current_scope; |
- context = context->previous(); |
+ scope_info = scope_info->HasOuterScopeInfo() ? scope_info->OuterScopeInfo() |
+ : nullptr; |
} |
if (innermost_scope == nullptr) return script_scope; |
script_scope->AddInnerScope(current_scope); |
-#if DEBUG |
- if (deserialization_mode == DeserializationMode::kIncludingVariables) { |
- if (script_scope->scope_info_.is_null()) { |
- DCHECK(!current_scope->scope_info_->HasOuterScopeInfo()); |
- } else { |
- DCHECK(!script_scope->scope_info_->HasOuterScopeInfo()); |
- DCHECK(script_scope->scope_info_->Equals( |
- current_scope->scope_info_->OuterScopeInfo())); |
- } |
- } |
-#endif |
return innermost_scope; |
} |
@@ -527,20 +502,19 @@ void DeclarationScope::Analyze(ParseInfo* info, AnalyzeMode mode) { |
DCHECK(info->literal() != NULL); |
DeclarationScope* scope = info->literal()->scope(); |
- if (!info->context().is_null() && !info->context()->IsNativeContext()) { |
+ Handle<ScopeInfo> outer_scope_info; |
+ if (info->maybe_outer_scope_info().ToHandle(&outer_scope_info)) { |
if (scope->outer_scope()) { |
DeclarationScope* script_scope = new (info->zone()) |
DeclarationScope(info->zone(), info->ast_value_factory()); |
info->set_script_scope(script_scope); |
scope->ReplaceOuterScope(Scope::DeserializeScopeChain( |
- info->isolate(), info->zone(), *info->context(), script_scope, |
+ info->isolate(), info->zone(), *outer_scope_info, script_scope, |
info->ast_value_factory(), |
Scope::DeserializationMode::kIncludingVariables)); |
} else { |
- DCHECK(info->context()->IsScriptContext()); |
- Handle<ScopeInfo> scope_info(info->context()->scope_info(), |
- info->isolate()); |
- scope->SetScriptScopeInfo(scope_info); |
+ DCHECK_EQ(outer_scope_info->scope_type(), SCRIPT_SCOPE); |
+ scope->SetScriptScopeInfo(outer_scope_info); |
} |
} |