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/v8.h" | 5 #include "src/v8.h" |
6 | 6 |
7 #include "src/ast.h" | 7 #include "src/ast.h" |
8 #include "src/ast-numbering.h" | 8 #include "src/ast-numbering.h" |
9 #include "src/code-factory.h" | 9 #include "src/code-factory.h" |
10 #include "src/codegen.h" | 10 #include "src/codegen.h" |
(...skipping 585 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
596 | 596 |
597 void FullCodeGenerator::DoTest(const TestContext* context) { | 597 void FullCodeGenerator::DoTest(const TestContext* context) { |
598 DoTest(context->condition(), | 598 DoTest(context->condition(), |
599 context->true_label(), | 599 context->true_label(), |
600 context->false_label(), | 600 context->false_label(), |
601 context->fall_through()); | 601 context->fall_through()); |
602 } | 602 } |
603 | 603 |
604 | 604 |
605 void FullCodeGenerator::AllocateModules(ZoneList<Declaration*>* declarations) { | 605 void FullCodeGenerator::AllocateModules(ZoneList<Declaration*>* declarations) { |
606 DCHECK(scope_->is_global_scope()); | 606 DCHECK(scope_->is_script_scope()); |
607 | 607 |
608 for (int i = 0; i < declarations->length(); i++) { | 608 for (int i = 0; i < declarations->length(); i++) { |
609 ModuleDeclaration* declaration = declarations->at(i)->AsModuleDeclaration(); | 609 ModuleDeclaration* declaration = declarations->at(i)->AsModuleDeclaration(); |
610 if (declaration != NULL) { | 610 if (declaration != NULL) { |
611 ModuleLiteral* module = declaration->module()->AsModuleLiteral(); | 611 ModuleLiteral* module = declaration->module()->AsModuleLiteral(); |
612 if (module != NULL) { | 612 if (module != NULL) { |
613 Comment cmnt(masm_, "[ Link nested modules"); | 613 Comment cmnt(masm_, "[ Link nested modules"); |
614 Scope* scope = module->body()->scope(); | 614 Scope* scope = module->body()->scope(); |
615 Interface* interface = scope->interface(); | 615 Interface* interface = scope->interface(); |
616 DCHECK(interface->IsModule() && interface->IsFrozen()); | 616 DCHECK(interface->IsModule() && interface->IsFrozen()); |
(...skipping 20 matching lines...) Expand all Loading... | |
637 } | 637 } |
638 } | 638 } |
639 | 639 |
640 | 640 |
641 // Modules have their own local scope, represented by their own context. | 641 // Modules have their own local scope, represented by their own context. |
642 // Module instance objects have an accessor for every export that forwards | 642 // Module instance objects have an accessor for every export that forwards |
643 // access to the respective slot from the module's context. (Exports that are | 643 // access to the respective slot from the module's context. (Exports that are |
644 // modules themselves, however, are simple data properties.) | 644 // modules themselves, however, are simple data properties.) |
645 // | 645 // |
646 // All modules have a _hosting_ scope/context, which (currently) is the | 646 // All modules have a _hosting_ scope/context, which (currently) is the |
647 // (innermost) enclosing global scope. To deal with recursion, nested modules | 647 // (innermost) enclosing script scope. To deal with recursion, nested modules |
rossberg
2014/11/12 09:49:27
Nit: can remove the "(innermost)"
Dmitry Lomov (no reviews)
2014/11/12 10:16:26
Done.
| |
648 // are hosted by the same scope as global ones. | 648 // are hosted by the same scope as global ones. |
649 // | 649 // |
650 // For every (global or nested) module literal, the hosting context has an | 650 // For every (global or nested) module literal, the hosting context has an |
651 // internal slot that points directly to the respective module context. This | 651 // internal slot that points directly to the respective module context. This |
652 // enables quick access to (statically resolved) module members by 2-dimensional | 652 // enables quick access to (statically resolved) module members by 2-dimensional |
653 // access through the hosting context. For example, | 653 // access through the hosting context. For example, |
654 // | 654 // |
655 // module A { | 655 // module A { |
656 // let x; | 656 // let x; |
657 // module B { let y; } | 657 // module B { let y; } |
(...skipping 10 matching lines...) Expand all Loading... | |
668 // | | 668 // | |
669 // +------------ [header| x | B ] (module) | 669 // +------------ [header| x | B ] (module) |
670 // | 670 // |
671 // Here, .A, .B, .C are the internal slots pointing to the hosted module | 671 // Here, .A, .B, .C are the internal slots pointing to the hosted module |
672 // contexts, whereas A, B, C hold the actual instance objects (note that every | 672 // contexts, whereas A, B, C hold the actual instance objects (note that every |
673 // module context also points to the respective instance object through its | 673 // module context also points to the respective instance object through its |
674 // extension slot in the header). | 674 // extension slot in the header). |
675 // | 675 // |
676 // To deal with arbitrary recursion and aliases between modules, | 676 // To deal with arbitrary recursion and aliases between modules, |
677 // they are created and initialized in several stages. Each stage applies to | 677 // they are created and initialized in several stages. Each stage applies to |
678 // all modules in the hosting global scope, including nested ones. | 678 // all modules in the hosting script scope, including nested ones. |
679 // | 679 // |
680 // 1. Allocate: for each module _literal_, allocate the module contexts and | 680 // 1. Allocate: for each module _literal_, allocate the module contexts and |
681 // respective instance object and wire them up. This happens in the | 681 // respective instance object and wire them up. This happens in the |
682 // PushModuleContext runtime function, as generated by AllocateModules | 682 // PushModuleContext runtime function, as generated by AllocateModules |
683 // (invoked by VisitDeclarations in the hosting scope). | 683 // (invoked by VisitDeclarations in the hosting scope). |
684 // | 684 // |
685 // 2. Bind: for each module _declaration_ (i.e. literals as well as aliases), | 685 // 2. Bind: for each module _declaration_ (i.e. literals as well as aliases), |
686 // assign the respective instance object to respective local variables. This | 686 // assign the respective instance object to respective local variables. This |
687 // happens in VisitModuleDeclaration, and uses the instance objects created | 687 // happens in VisitModuleDeclaration, and uses the instance objects created |
688 // in the previous stage. | 688 // in the previous stage. |
(...skipping 14 matching lines...) Expand all Loading... | |
703 Handle<FixedArray> saved_modules = modules_; | 703 Handle<FixedArray> saved_modules = modules_; |
704 int saved_module_index = module_index_; | 704 int saved_module_index = module_index_; |
705 ZoneList<Handle<Object> >* saved_globals = globals_; | 705 ZoneList<Handle<Object> >* saved_globals = globals_; |
706 ZoneList<Handle<Object> > inner_globals(10, zone()); | 706 ZoneList<Handle<Object> > inner_globals(10, zone()); |
707 globals_ = &inner_globals; | 707 globals_ = &inner_globals; |
708 | 708 |
709 if (scope_->num_modules() != 0) { | 709 if (scope_->num_modules() != 0) { |
710 // This is a scope hosting modules. Allocate a descriptor array to pass | 710 // This is a scope hosting modules. Allocate a descriptor array to pass |
711 // to the runtime for initialization. | 711 // to the runtime for initialization. |
712 Comment cmnt(masm_, "[ Allocate modules"); | 712 Comment cmnt(masm_, "[ Allocate modules"); |
713 DCHECK(scope_->is_global_scope()); | 713 DCHECK(scope_->is_script_scope()); |
714 modules_ = | 714 modules_ = |
715 isolate()->factory()->NewFixedArray(scope_->num_modules(), TENURED); | 715 isolate()->factory()->NewFixedArray(scope_->num_modules(), TENURED); |
716 module_index_ = 0; | 716 module_index_ = 0; |
717 | 717 |
718 // Generate code for allocating all modules, including nested ones. | 718 // Generate code for allocating all modules, including nested ones. |
719 // The allocated contexts are stored in internal variables in this scope. | 719 // The allocated contexts are stored in internal variables in this scope. |
720 AllocateModules(declarations); | 720 AllocateModules(declarations); |
721 } | 721 } |
722 | 722 |
723 AstVisitor::VisitDeclarations(declarations); | 723 AstVisitor::VisitDeclarations(declarations); |
(...skipping 1023 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1747 } | 1747 } |
1748 return true; | 1748 return true; |
1749 } | 1749 } |
1750 #endif // DEBUG | 1750 #endif // DEBUG |
1751 | 1751 |
1752 | 1752 |
1753 #undef __ | 1753 #undef __ |
1754 | 1754 |
1755 | 1755 |
1756 } } // namespace v8::internal | 1756 } } // namespace v8::internal |
OLD | NEW |