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