| Index: src/ast/scopeinfo.cc
|
| diff --git a/src/ast/scopeinfo.cc b/src/ast/scopeinfo.cc
|
| index a9e824f415bae54881eb5dc84c3787905418756c..f4d6079c0ab9c0531f2485be7503c0d1c38850d1 100644
|
| --- a/src/ast/scopeinfo.cc
|
| +++ b/src/ast/scopeinfo.cc
|
| @@ -71,10 +71,13 @@ Handle<ScopeInfo> ScopeInfo::Create(Isolate* isolate, Zone* zone,
|
| const bool has_function_name = function_name_info != NONE;
|
| const bool has_receiver = receiver_info == STACK || receiver_info == CONTEXT;
|
| const int parameter_count = scope->num_parameters();
|
| + const bool has_outer_scope_info =
|
| + scope->GetOuterScopeWithContext() != nullptr;
|
| const int length = kVariablePartIndex + parameter_count +
|
| (1 + stack_local_count) + 2 * context_local_count +
|
| - 2 * context_global_count +
|
| - (has_receiver ? 1 : 0) + (has_function_name ? 2 : 0);
|
| + 2 * context_global_count + (has_receiver ? 1 : 0) +
|
| + (has_function_name ? 2 : 0) +
|
| + (has_outer_scope_info ? 1 : 0);
|
|
|
| Factory* factory = isolate->factory();
|
| Handle<ScopeInfo> scope_info = factory->NewScopeInfo(length);
|
| @@ -103,7 +106,8 @@ Handle<ScopeInfo> ScopeInfo::Create(Isolate* isolate, Zone* zone,
|
| AsmModuleField::encode(asm_module) |
|
| AsmFunctionField::encode(asm_function) |
|
| HasSimpleParametersField::encode(has_simple_parameters) |
|
| - FunctionKindField::encode(function_kind);
|
| + FunctionKindField::encode(function_kind) |
|
| + HasOuterScopeInfoField::encode(has_outer_scope_info);
|
| scope_info->SetFlags(flags);
|
| scope_info->SetParameterCount(parameter_count);
|
| scope_info->SetStackLocalCount(stack_local_count);
|
| @@ -191,6 +195,14 @@ Handle<ScopeInfo> ScopeInfo::Create(Isolate* isolate, Zone* zone,
|
| var_index == scope_info->ContextLength() - 1);
|
| }
|
|
|
| + // If present, add the outer scope info.
|
| + DCHECK(index == scope_info->OuterScopeInfoEntryIndex());
|
| + if (has_outer_scope_info) {
|
| + Handle<ScopeInfo> outer_scope_info =
|
| + scope->GetOuterScopeWithContext()->GetScopeInfo(isolate);
|
| + scope_info->set(index++, *outer_scope_info);
|
| + }
|
| +
|
| DCHECK(index == scope_info->length());
|
| DCHECK(scope->num_parameters() == scope_info->ParameterCount());
|
| DCHECK(scope->num_heap_slots() == scope_info->ContextLength() ||
|
| @@ -212,26 +224,28 @@ Handle<ScopeInfo> ScopeInfo::CreateGlobalThisBinding(Isolate* isolate) {
|
| const VariableMode function_variable_mode = VAR;
|
| const bool has_function_name = false;
|
| const bool has_receiver = true;
|
| + const bool has_outer_scope_info = false;
|
| const int parameter_count = 0;
|
| const int length = kVariablePartIndex + parameter_count +
|
| (1 + stack_local_count) + 2 * context_local_count +
|
| - 2 * context_global_count +
|
| - (has_receiver ? 1 : 0) + (has_function_name ? 2 : 0);
|
| + 2 * context_global_count + (has_receiver ? 1 : 0) +
|
| + (has_function_name ? 2 : 0) +
|
| + (has_outer_scope_info ? 1 : 0);
|
|
|
| Factory* factory = isolate->factory();
|
| Handle<ScopeInfo> scope_info = factory->NewScopeInfo(length);
|
|
|
| // Encode the flags.
|
| - int flags = ScopeTypeField::encode(SCRIPT_SCOPE) |
|
| - CallsEvalField::encode(false) |
|
| - LanguageModeField::encode(SLOPPY) |
|
| - DeclarationScopeField::encode(true) |
|
| - ReceiverVariableField::encode(receiver_info) |
|
| - FunctionVariableField::encode(function_name_info) |
|
| - FunctionVariableMode::encode(function_variable_mode) |
|
| - AsmModuleField::encode(false) | AsmFunctionField::encode(false) |
|
| - HasSimpleParametersField::encode(has_simple_parameters) |
|
| - FunctionKindField::encode(FunctionKind::kNormalFunction);
|
| + int flags =
|
| + ScopeTypeField::encode(SCRIPT_SCOPE) | CallsEvalField::encode(false) |
|
| + LanguageModeField::encode(SLOPPY) | DeclarationScopeField::encode(true) |
|
| + ReceiverVariableField::encode(receiver_info) |
|
| + FunctionVariableField::encode(function_name_info) |
|
| + FunctionVariableMode::encode(function_variable_mode) |
|
| + AsmModuleField::encode(false) | AsmFunctionField::encode(false) |
|
| + HasSimpleParametersField::encode(has_simple_parameters) |
|
| + FunctionKindField::encode(FunctionKind::kNormalFunction) |
|
| + HasOuterScopeInfoField::encode(has_outer_scope_info);
|
| scope_info->SetFlags(flags);
|
| scope_info->SetParameterCount(parameter_count);
|
| scope_info->SetStackLocalCount(stack_local_count);
|
| @@ -259,6 +273,7 @@ Handle<ScopeInfo> ScopeInfo::CreateGlobalThisBinding(Isolate* isolate) {
|
| scope_info->set(index++, Smi::FromInt(receiver_index));
|
|
|
| DCHECK(index == scope_info->FunctionNameEntryIndex());
|
| + DCHECK(index == scope_info->OuterScopeInfoEntryIndex());
|
|
|
| DCHECK_EQ(index, scope_info->length());
|
| DCHECK_EQ(scope_info->ParameterCount(), 0);
|
| @@ -362,6 +377,13 @@ bool ScopeInfo::HasFunctionName() {
|
| }
|
| }
|
|
|
| +bool ScopeInfo::HasOuterScopeInfo() {
|
| + if (length() > 0) {
|
| + return HasOuterScopeInfoField::decode(Flags());
|
| + } else {
|
| + return false;
|
| + }
|
| +}
|
|
|
| bool ScopeInfo::HasHeapAllocatedLocals() {
|
| if (length() > 0) {
|
| @@ -382,6 +404,10 @@ String* ScopeInfo::FunctionName() {
|
| return String::cast(get(FunctionNameEntryIndex()));
|
| }
|
|
|
| +ScopeInfo* ScopeInfo::OuterScopeInfo() {
|
| + DCHECK(HasOuterScopeInfo());
|
| + return ScopeInfo::cast(get(OuterScopeInfoEntryIndex()));
|
| +}
|
|
|
| String* ScopeInfo::ParameterName(int var) {
|
| DCHECK(0 <= var && var < ParameterCount());
|
| @@ -643,6 +669,10 @@ int ScopeInfo::FunctionNameEntryIndex() {
|
| return ReceiverEntryIndex() + (HasAllocatedReceiver() ? 1 : 0);
|
| }
|
|
|
| +int ScopeInfo::OuterScopeInfoEntryIndex() {
|
| + return FunctionNameEntryIndex() + (HasFunctionName() ? 2 : 0);
|
| +}
|
| +
|
| #ifdef DEBUG
|
|
|
| static void PrintList(const char* list_name,
|
|
|