| OLD | NEW |
| 1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include <stdlib.h> | 5 #include <stdlib.h> |
| 6 | 6 |
| 7 #include "src/ast/context-slot-cache.h" | 7 #include "src/ast/context-slot-cache.h" |
| 8 #include "src/ast/scopes.h" | 8 #include "src/ast/scopes.h" |
| 9 #include "src/ast/variables.h" | 9 #include "src/ast/variables.h" |
| 10 #include "src/bootstrapper.h" | 10 #include "src/bootstrapper.h" |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 51 } | 51 } |
| 52 } | 52 } |
| 53 } | 53 } |
| 54 return true; | 54 return true; |
| 55 } | 55 } |
| 56 #endif | 56 #endif |
| 57 | 57 |
| 58 Handle<ScopeInfo> ScopeInfo::Create(Isolate* isolate, Zone* zone, Scope* scope, | 58 Handle<ScopeInfo> ScopeInfo::Create(Isolate* isolate, Zone* zone, Scope* scope, |
| 59 MaybeHandle<ScopeInfo> outer_scope) { | 59 MaybeHandle<ScopeInfo> outer_scope) { |
| 60 // Collect variables. | 60 // Collect variables. |
| 61 ZoneList<Variable*>* locals = scope->locals(); | |
| 62 int stack_local_count = 0; | 61 int stack_local_count = 0; |
| 63 int context_local_count = 0; | 62 int context_local_count = 0; |
| 64 int module_vars_count = 0; | 63 int module_vars_count = 0; |
| 65 // Stack allocated block scope variables are allocated in the parent | 64 // Stack allocated block scope variables are allocated in the parent |
| 66 // declaration scope, but are recorded in the block scope's scope info. First | 65 // declaration scope, but are recorded in the block scope's scope info. First |
| 67 // slot index indicates at which offset a particular scope starts in the | 66 // slot index indicates at which offset a particular scope starts in the |
| 68 // parent declaration scope. | 67 // parent declaration scope. |
| 69 int first_slot_index = 0; | 68 int first_slot_index = 0; |
| 70 for (int i = 0; i < locals->length(); i++) { | 69 for (Variable* var : *scope->locals()) { |
| 71 Variable* var = locals->at(i); | |
| 72 switch (var->location()) { | 70 switch (var->location()) { |
| 73 case VariableLocation::LOCAL: | 71 case VariableLocation::LOCAL: |
| 74 if (stack_local_count == 0) first_slot_index = var->index(); | 72 if (stack_local_count == 0) first_slot_index = var->index(); |
| 75 stack_local_count++; | 73 stack_local_count++; |
| 76 break; | 74 break; |
| 77 case VariableLocation::CONTEXT: | 75 case VariableLocation::CONTEXT: |
| 78 context_local_count++; | 76 context_local_count++; |
| 79 break; | 77 break; |
| 80 case VariableLocation::MODULE: | 78 case VariableLocation::MODULE: |
| 81 module_vars_count++; | 79 module_vars_count++; |
| (...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 191 // Context locals are added using their index. | 189 // Context locals are added using their index. |
| 192 DCHECK_EQ(index, scope_info->StackLocalFirstSlotIndex()); | 190 DCHECK_EQ(index, scope_info->StackLocalFirstSlotIndex()); |
| 193 scope_info->set(index++, Smi::FromInt(first_slot_index)); | 191 scope_info->set(index++, Smi::FromInt(first_slot_index)); |
| 194 DCHECK_EQ(index, scope_info->StackLocalNamesIndex()); | 192 DCHECK_EQ(index, scope_info->StackLocalNamesIndex()); |
| 195 | 193 |
| 196 int stack_local_base = index; | 194 int stack_local_base = index; |
| 197 int context_local_base = stack_local_base + stack_local_count; | 195 int context_local_base = stack_local_base + stack_local_count; |
| 198 int context_local_info_base = context_local_base + context_local_count; | 196 int context_local_info_base = context_local_base + context_local_count; |
| 199 int module_var_entry = scope_info->ModuleVariablesIndex(); | 197 int module_var_entry = scope_info->ModuleVariablesIndex(); |
| 200 | 198 |
| 201 for (int i = 0; i < locals->length(); ++i) { | 199 for (Variable* var : *scope->locals()) { |
| 202 Variable* var = locals->at(i); | |
| 203 switch (var->location()) { | 200 switch (var->location()) { |
| 204 case VariableLocation::LOCAL: { | 201 case VariableLocation::LOCAL: { |
| 205 int local_index = var->index() - first_slot_index; | 202 int local_index = var->index() - first_slot_index; |
| 206 DCHECK_LE(0, local_index); | 203 DCHECK_LE(0, local_index); |
| 207 DCHECK_LT(local_index, stack_local_count); | 204 DCHECK_LT(local_index, stack_local_count); |
| 208 scope_info->set(stack_local_base + local_index, *var->name()); | 205 scope_info->set(stack_local_base + local_index, *var->name()); |
| 209 break; | 206 break; |
| 210 } | 207 } |
| 211 case VariableLocation::CONTEXT: { | 208 case VariableLocation::CONTEXT: { |
| 212 // Due to duplicate parameters, context locals aren't guaranteed to come | 209 // Due to duplicate parameters, context locals aren't guaranteed to come |
| (...skipping 732 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 945 if (String::cast(entry->local_name())->Equals(*local_name)) { | 942 if (String::cast(entry->local_name())->Equals(*local_name)) { |
| 946 return entry; | 943 return entry; |
| 947 } | 944 } |
| 948 } | 945 } |
| 949 UNREACHABLE(); | 946 UNREACHABLE(); |
| 950 return Handle<ModuleInfoEntry>(); | 947 return Handle<ModuleInfoEntry>(); |
| 951 } | 948 } |
| 952 | 949 |
| 953 } // namespace internal | 950 } // namespace internal |
| 954 } // namespace v8 | 951 } // namespace v8 |
| OLD | NEW |