Index: src/ast/scopes.cc |
diff --git a/src/ast/scopes.cc b/src/ast/scopes.cc |
index a0b23234166506e9ca328677d6056071d55dce64..3b441e993cad3eda133b15a8da0d42acb4daec75 100644 |
--- a/src/ast/scopes.cc |
+++ b/src/ast/scopes.cc |
@@ -286,6 +286,10 @@ Scope* Scope::DeserializeScopeChain(Isolate* isolate, Zone* zone, |
// nesting script scopes. |
Handle<ScopeInfo> scope_info(context->scope_info(), isolate); |
script_scope->SetScriptScopeInfo(scope_info); |
+ script_scope->DeserializeScopeInfo(isolate, ast_value_factory); |
+ if (deserialization_mode == DeserializationMode::kDeserializeOffHeap) { |
+ script_scope->scope_info_ = Handle<ScopeInfo>::null(); |
+ } |
DCHECK(context->previous()->IsNativeContext()); |
break; |
} else if (context->IsFunctionContext()) { |
@@ -321,8 +325,9 @@ Scope* Scope::DeserializeScopeChain(Isolate* isolate, Zone* zone, |
outer_scope->AddInnerScope(current_scope); |
} |
current_scope = outer_scope; |
+ current_scope->DeserializeScopeInfo(isolate, ast_value_factory); |
if (deserialization_mode == DeserializationMode::kDeserializeOffHeap) { |
- current_scope->DeserializeScopeInfo(isolate, ast_value_factory); |
+ current_scope->scope_info_ = Handle<ScopeInfo>::null(); |
} |
if (innermost_scope == nullptr) innermost_scope = current_scope; |
context = context->previous(); |
@@ -398,8 +403,6 @@ void Scope::DeserializeScopeInfo(Isolate* isolate, |
result->AllocateTo(VariableLocation::CONTEXT, index); |
} |
} |
- |
- scope_info_ = Handle<ScopeInfo>::null(); |
} |
DeclarationScope* Scope::AsDeclarationScope() { |
@@ -609,75 +612,9 @@ void Scope::PropagateUsageFlagsToScope(Scope* other) { |
if (calls_eval()) other->RecordEvalCall(); |
} |
-Variable* Scope::LookupInScopeInfo(const AstRawString* name) { |
- Handle<String> name_handle = name->string(); |
- // The Scope is backed up by ScopeInfo. This means it cannot operate in a |
- // heap-independent mode, and all strings must be internalized immediately. So |
- // it's ok to get the Handle<String> here. |
- // If we have a serialized scope info, we might find the variable there. |
- // There should be no local slot with the given name. |
- DCHECK(scope_info_->StackSlotIndex(*name_handle) < 0); |
- |
- VariableMode mode; |
- InitializationFlag init_flag; |
- MaybeAssignedFlag maybe_assigned_flag; |
- |
- VariableLocation location = VariableLocation::CONTEXT; |
- int index = ScopeInfo::ContextSlotIndex(scope_info_, name_handle, &mode, |
- &init_flag, &maybe_assigned_flag); |
- if (index < 0) { |
- location = VariableLocation::GLOBAL; |
- index = ScopeInfo::ContextGlobalSlotIndex(scope_info_, name_handle, &mode, |
- &init_flag, &maybe_assigned_flag); |
- DCHECK(index < 0 || (is_script_scope() && mode == VAR)); |
- } |
- if (index < 0) { |
- location = VariableLocation::LOOKUP; |
- index = scope_info_->ParameterIndex(*name_handle); |
- if (index >= 0) { |
- mode = DYNAMIC; |
- init_flag = kCreatedInitialized; |
- // Be conservative and flag parameters as maybe assigned. Better |
- // information would require ScopeInfo to serialize the maybe_assigned bit |
- // also for parameters. |
- maybe_assigned_flag = kMaybeAssigned; |
- } |
- } |
- if (index < 0 && scope_type() == MODULE_SCOPE) { |
- location = VariableLocation::MODULE; |
- index = -1; // TODO(neis): Find module variables in scope info. |
- } |
- if (index < 0) return nullptr; // Nowhere found. |
- |
- Variable::Kind kind = Variable::NORMAL; |
- if (location == VariableLocation::CONTEXT && |
- index == scope_info_->ReceiverContextSlotIndex()) { |
- kind = Variable::THIS; |
- } |
- // TODO(marja, rossberg): Correctly declare FUNCTION, CLASS, NEW_TARGET, and |
- // ARGUMENTS bindings as their corresponding Variable::Kind. |
- |
- Variable* var = variables_.Declare(zone(), this, name, mode, kind, init_flag, |
- maybe_assigned_flag); |
- var->AllocateTo(location, index); |
- return var; |
-} |
- |
Variable* DeclarationScope::LookupFunctionVar(const AstRawString* name) { |
- if (function_ != nullptr && function_->raw_name() == name) { |
- return function_; |
- } else if (!scope_info_.is_null()) { |
- // If we are backed by a scope info, try to lookup the variable there. |
- VariableMode mode; |
- int index = scope_info_->FunctionContextSlotIndex(*(name->string()), &mode); |
- if (index < 0) return nullptr; |
- Variable* var = DeclareFunctionVar(name); |
- DCHECK_EQ(mode, var->mode()); |
- var->AllocateTo(VariableLocation::CONTEXT, index); |
- return var; |
- } else { |
- return nullptr; |
- } |
+ if (function_ != nullptr && function_->raw_name() == name) return function_; |
+ return nullptr; |
} |