| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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 "src/ast/scopes.h" | 5 #include "src/ast/scopes.h" |
| 6 | 6 |
| 7 #include <set> | 7 #include <set> |
| 8 | 8 |
| 9 #include "src/accessors.h" | 9 #include "src/accessors.h" |
| 10 #include "src/bootstrapper.h" | 10 #include "src/bootstrapper.h" |
| (...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 157 | 157 |
| 158 ModuleScope::ModuleScope(DeclarationScope* script_scope, | 158 ModuleScope::ModuleScope(DeclarationScope* script_scope, |
| 159 AstValueFactory* ast_value_factory) | 159 AstValueFactory* ast_value_factory) |
| 160 : DeclarationScope(ast_value_factory->zone(), script_scope, MODULE_SCOPE) { | 160 : DeclarationScope(ast_value_factory->zone(), script_scope, MODULE_SCOPE) { |
| 161 Zone* zone = ast_value_factory->zone(); | 161 Zone* zone = ast_value_factory->zone(); |
| 162 module_descriptor_ = new (zone) ModuleDescriptor(zone); | 162 module_descriptor_ = new (zone) ModuleDescriptor(zone); |
| 163 set_language_mode(STRICT); | 163 set_language_mode(STRICT); |
| 164 DeclareThis(ast_value_factory); | 164 DeclareThis(ast_value_factory); |
| 165 } | 165 } |
| 166 | 166 |
| 167 ModuleScope::ModuleScope(Isolate* isolate, Handle<ScopeInfo> scope_info, |
| 168 AstValueFactory* avfactory) |
| 169 : DeclarationScope(avfactory->zone(), MODULE_SCOPE, scope_info) { |
| 170 Zone* zone = avfactory->zone(); |
| 171 ModuleInfo* module_info = scope_info->ModuleDescriptorInfo(); |
| 172 |
| 173 set_language_mode(STRICT); |
| 174 module_descriptor_ = new (zone) ModuleDescriptor(zone); |
| 175 |
| 176 // Deserialize special exports. |
| 177 Handle<FixedArray> special_exports = handle(module_info->special_exports()); |
| 178 for (int i = 0, n = special_exports->length(); i < n; ++i) { |
| 179 Handle<FixedArray> serialized_entry( |
| 180 FixedArray::cast(special_exports->get(i)), isolate); |
| 181 module_descriptor_->AddSpecialExport( |
| 182 ModuleDescriptor::Entry::Deserialize(isolate, avfactory, |
| 183 serialized_entry), |
| 184 avfactory->zone()); |
| 185 } |
| 186 |
| 187 // Deserialize regular exports. |
| 188 Handle<FixedArray> regular_exports = handle(module_info->regular_exports()); |
| 189 for (int i = 0, n = regular_exports->length(); i < n; ++i) { |
| 190 Handle<FixedArray> serialized_entry( |
| 191 FixedArray::cast(regular_exports->get(i)), isolate); |
| 192 module_descriptor_->AddRegularExport(ModuleDescriptor::Entry::Deserialize( |
| 193 isolate, avfactory, serialized_entry)); |
| 194 } |
| 195 } |
| 196 |
| 167 Scope::Scope(Zone* zone, ScopeType scope_type, Handle<ScopeInfo> scope_info) | 197 Scope::Scope(Zone* zone, ScopeType scope_type, Handle<ScopeInfo> scope_info) |
| 168 : zone_(zone), | 198 : zone_(zone), |
| 169 outer_scope_(nullptr), | 199 outer_scope_(nullptr), |
| 170 variables_(zone), | 200 variables_(zone), |
| 171 locals_(0, zone), | 201 locals_(0, zone), |
| 172 decls_(0, zone), | 202 decls_(0, zone), |
| 173 scope_info_(scope_info), | 203 scope_info_(scope_info), |
| 174 scope_type_(scope_type) { | 204 scope_type_(scope_type) { |
| 175 DCHECK(!scope_info.is_null()); | 205 DCHECK(!scope_info.is_null()); |
| 176 SetDefaults(); | 206 SetDefaults(); |
| (...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 321 outer_scope->AsDeclarationScope()->set_asm_module(); | 351 outer_scope->AsDeclarationScope()->set_asm_module(); |
| 322 } else if (context->IsBlockContext()) { | 352 } else if (context->IsBlockContext()) { |
| 323 Handle<ScopeInfo> scope_info(context->scope_info(), isolate); | 353 Handle<ScopeInfo> scope_info(context->scope_info(), isolate); |
| 324 DCHECK_EQ(scope_info->scope_type(), BLOCK_SCOPE); | 354 DCHECK_EQ(scope_info->scope_type(), BLOCK_SCOPE); |
| 325 if (scope_info->is_declaration_scope()) { | 355 if (scope_info->is_declaration_scope()) { |
| 326 outer_scope = | 356 outer_scope = |
| 327 new (zone) DeclarationScope(zone, BLOCK_SCOPE, scope_info); | 357 new (zone) DeclarationScope(zone, BLOCK_SCOPE, scope_info); |
| 328 } else { | 358 } else { |
| 329 outer_scope = new (zone) Scope(zone, BLOCK_SCOPE, scope_info); | 359 outer_scope = new (zone) Scope(zone, BLOCK_SCOPE, scope_info); |
| 330 } | 360 } |
| 361 } else if (context->IsModuleContext()) { |
| 362 ScopeInfo* scope_info = context->closure()->shared()->scope_info(); |
| 363 DCHECK_EQ(scope_info->scope_type(), MODULE_SCOPE); |
| 364 outer_scope = new (zone) ModuleScope( |
| 365 isolate, Handle<ScopeInfo>(scope_info), ast_value_factory); |
| 331 } else { | 366 } else { |
| 332 DCHECK(context->IsCatchContext()); | 367 DCHECK(context->IsCatchContext()); |
| 333 String* name = context->catch_name(); | 368 String* name = context->catch_name(); |
| 334 outer_scope = new (zone) | 369 outer_scope = new (zone) |
| 335 Scope(zone, ast_value_factory->GetString(handle(name, isolate))); | 370 Scope(zone, ast_value_factory->GetString(handle(name, isolate))); |
| 336 } | 371 } |
| 337 if (current_scope != nullptr) { | 372 if (current_scope != nullptr) { |
| 338 outer_scope->AddInnerScope(current_scope); | 373 outer_scope->AddInnerScope(current_scope); |
| 339 } | 374 } |
| 340 current_scope = outer_scope; | 375 current_scope = outer_scope; |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 421 DeclarationScope* scope = info->literal()->scope(); | 456 DeclarationScope* scope = info->literal()->scope(); |
| 422 | 457 |
| 423 // We are compiling one of three cases: | 458 // We are compiling one of three cases: |
| 424 // 1) top-level code, | 459 // 1) top-level code, |
| 425 // 2) a function/eval/module on the top-level | 460 // 2) a function/eval/module on the top-level |
| 426 // 3) a function/eval in a scope that was already resolved. | 461 // 3) a function/eval in a scope that was already resolved. |
| 427 DCHECK(scope->scope_type() == SCRIPT_SCOPE || | 462 DCHECK(scope->scope_type() == SCRIPT_SCOPE || |
| 428 scope->outer_scope()->scope_type() == SCRIPT_SCOPE || | 463 scope->outer_scope()->scope_type() == SCRIPT_SCOPE || |
| 429 scope->outer_scope()->already_resolved_); | 464 scope->outer_scope()->already_resolved_); |
| 430 | 465 |
| 466 // For modules, we want to start variable allocation at the surrounding script |
| 467 // scope. |
| 468 if (scope->is_module_scope()) { |
| 469 scope = scope->outer_scope()->AsDeclarationScope(); |
| 470 } |
| 471 |
| 431 scope->AllocateVariables(info, mode); | 472 scope->AllocateVariables(info, mode); |
| 432 | 473 |
| 433 #ifdef DEBUG | 474 #ifdef DEBUG |
| 434 if (info->script_is_native() ? FLAG_print_builtin_scopes | 475 if (info->script_is_native() ? FLAG_print_builtin_scopes |
| 435 : FLAG_print_scopes) { | 476 : FLAG_print_scopes) { |
| 436 scope->Print(); | 477 scope->Print(); |
| 437 } | 478 } |
| 438 scope->CheckScopePositions(); | 479 scope->CheckScopePositions(); |
| 439 scope->CheckZones(); | 480 scope->CheckZones(); |
| 440 #endif | 481 #endif |
| (...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 610 | 651 |
| 611 VariableMode mode; | 652 VariableMode mode; |
| 612 InitializationFlag init_flag; | 653 InitializationFlag init_flag; |
| 613 MaybeAssignedFlag maybe_assigned_flag; | 654 MaybeAssignedFlag maybe_assigned_flag; |
| 614 | 655 |
| 615 VariableLocation location = VariableLocation::CONTEXT; | 656 VariableLocation location = VariableLocation::CONTEXT; |
| 616 int index = ScopeInfo::ContextSlotIndex(scope_info_, name_handle, &mode, | 657 int index = ScopeInfo::ContextSlotIndex(scope_info_, name_handle, &mode, |
| 617 &init_flag, &maybe_assigned_flag); | 658 &init_flag, &maybe_assigned_flag); |
| 618 if (index < 0 && scope_type() == MODULE_SCOPE) { | 659 if (index < 0 && scope_type() == MODULE_SCOPE) { |
| 619 location = VariableLocation::MODULE; | 660 location = VariableLocation::MODULE; |
| 620 index = -1; // TODO(neis): Find module variables in scope info. | 661 index = scope_info_->ModuleIndex(name_handle, &mode, &init_flag, |
| 662 &maybe_assigned_flag); |
| 621 } | 663 } |
| 622 if (index < 0) return nullptr; // Nowhere found. | 664 if (index < 0) return nullptr; // Nowhere found. |
| 623 | 665 |
| 624 Variable::Kind kind = Variable::NORMAL; | 666 Variable::Kind kind = Variable::NORMAL; |
| 625 if (location == VariableLocation::CONTEXT && | 667 if (location == VariableLocation::CONTEXT && |
| 626 index == scope_info_->ReceiverContextSlotIndex()) { | 668 index == scope_info_->ReceiverContextSlotIndex()) { |
| 627 kind = Variable::THIS; | 669 kind = Variable::THIS; |
| 628 } | 670 } |
| 629 // TODO(marja, rossberg): Correctly declare FUNCTION, CLASS, NEW_TARGET, and | 671 // TODO(marja, rossberg): Correctly declare FUNCTION, CLASS, NEW_TARGET, and |
| 630 // ARGUMENTS bindings as their corresponding Variable::Kind. | 672 // ARGUMENTS bindings as their corresponding Variable::Kind. |
| (...skipping 1025 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1656 Variable* function = | 1698 Variable* function = |
| 1657 is_function_scope() ? AsDeclarationScope()->function_var() : nullptr; | 1699 is_function_scope() ? AsDeclarationScope()->function_var() : nullptr; |
| 1658 bool is_function_var_in_context = | 1700 bool is_function_var_in_context = |
| 1659 function != nullptr && function->IsContextSlot(); | 1701 function != nullptr && function->IsContextSlot(); |
| 1660 return num_heap_slots() - Context::MIN_CONTEXT_SLOTS - | 1702 return num_heap_slots() - Context::MIN_CONTEXT_SLOTS - |
| 1661 (is_function_var_in_context ? 1 : 0); | 1703 (is_function_var_in_context ? 1 : 0); |
| 1662 } | 1704 } |
| 1663 | 1705 |
| 1664 } // namespace internal | 1706 } // namespace internal |
| 1665 } // namespace v8 | 1707 } // namespace v8 |
| OLD | NEW |