| 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 629 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 640 DCHECK_EQ(scope_type(), MODULE_SCOPE); | 640 DCHECK_EQ(scope_type(), MODULE_SCOPE); |
| 641 DCHECK(name->IsInternalizedString()); | 641 DCHECK(name->IsInternalizedString()); |
| 642 DCHECK_NOT_NULL(mode); | 642 DCHECK_NOT_NULL(mode); |
| 643 DCHECK_NOT_NULL(init_flag); | 643 DCHECK_NOT_NULL(init_flag); |
| 644 DCHECK_NOT_NULL(maybe_assigned_flag); | 644 DCHECK_NOT_NULL(maybe_assigned_flag); |
| 645 | 645 |
| 646 int module_vars_count = Smi::cast(get(ModuleVariableCountIndex()))->value(); | 646 int module_vars_count = Smi::cast(get(ModuleVariableCountIndex()))->value(); |
| 647 int entry = ModuleVariablesIndex(); | 647 int entry = ModuleVariablesIndex(); |
| 648 for (int i = 0; i < module_vars_count; ++i) { | 648 for (int i = 0; i < module_vars_count; ++i) { |
| 649 if (*name == get(entry + kModuleVariableNameOffset)) { | 649 if (*name == get(entry + kModuleVariableNameOffset)) { |
| 650 int index = Smi::cast(get(entry + kModuleVariableIndexOffset))->value(); | 650 int index; |
| 651 int properties = | 651 ModuleVariable(i, nullptr, &index, mode, init_flag, maybe_assigned_flag); |
| 652 Smi::cast(get(entry + kModuleVariablePropertiesOffset))->value(); | |
| 653 *mode = VariableModeField::decode(properties); | |
| 654 *init_flag = InitFlagField::decode(properties); | |
| 655 *maybe_assigned_flag = MaybeAssignedFlagField::decode(properties); | |
| 656 return index; | 652 return index; |
| 657 } | 653 } |
| 658 entry += kModuleVariableEntryLength; | 654 entry += kModuleVariableEntryLength; |
| 659 } | 655 } |
| 660 | 656 |
| 661 return -1; | 657 return -1; |
| 662 } | 658 } |
| 663 | 659 |
| 664 int ScopeInfo::ContextSlotIndex(Handle<ScopeInfo> scope_info, | 660 int ScopeInfo::ContextSlotIndex(Handle<ScopeInfo> scope_info, |
| 665 Handle<String> name, VariableMode* mode, | 661 Handle<String> name, VariableMode* mode, |
| (...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 787 } | 783 } |
| 788 | 784 |
| 789 int ScopeInfo::ModuleInfoIndex() { | 785 int ScopeInfo::ModuleInfoIndex() { |
| 790 return OuterScopeInfoIndex() + (HasOuterScopeInfo() ? 1 : 0); | 786 return OuterScopeInfoIndex() + (HasOuterScopeInfo() ? 1 : 0); |
| 791 } | 787 } |
| 792 | 788 |
| 793 int ScopeInfo::ModuleVariableCountIndex() { return ModuleInfoIndex() + 1; } | 789 int ScopeInfo::ModuleVariableCountIndex() { return ModuleInfoIndex() + 1; } |
| 794 | 790 |
| 795 int ScopeInfo::ModuleVariablesIndex() { return ModuleVariableCountIndex() + 1; } | 791 int ScopeInfo::ModuleVariablesIndex() { return ModuleVariableCountIndex() + 1; } |
| 796 | 792 |
| 793 void ScopeInfo::ModuleVariable(int i, String** name, int* index, |
| 794 VariableMode* mode, |
| 795 InitializationFlag* init_flag, |
| 796 MaybeAssignedFlag* maybe_assigned_flag) { |
| 797 DCHECK_LE(0, i); |
| 798 DCHECK_LT(i, Smi::cast(get(ModuleVariableCountIndex()))->value()); |
| 799 |
| 800 int entry = ModuleVariablesIndex() + i * kModuleVariableEntryLength; |
| 801 int properties = |
| 802 Smi::cast(get(entry + kModuleVariablePropertiesOffset))->value(); |
| 803 |
| 804 if (name != nullptr) { |
| 805 *name = String::cast(get(entry + kModuleVariableNameOffset)); |
| 806 } |
| 807 if (index != nullptr) { |
| 808 *index = Smi::cast(get(entry + kModuleVariableIndexOffset))->value(); |
| 809 } |
| 810 if (mode != nullptr) { |
| 811 *mode = VariableModeField::decode(properties); |
| 812 } |
| 813 if (init_flag != nullptr) { |
| 814 *init_flag = InitFlagField::decode(properties); |
| 815 } |
| 816 if (maybe_assigned_flag != nullptr) { |
| 817 *maybe_assigned_flag = MaybeAssignedFlagField::decode(properties); |
| 818 } |
| 819 } |
| 820 |
| 797 #ifdef DEBUG | 821 #ifdef DEBUG |
| 798 | 822 |
| 799 static void PrintList(const char* list_name, | 823 static void PrintList(const char* list_name, |
| 800 int nof_internal_slots, | 824 int nof_internal_slots, |
| 801 int start, | 825 int start, |
| 802 int end, | 826 int end, |
| 803 ScopeInfo* scope_info) { | 827 ScopeInfo* scope_info) { |
| 804 if (start < end) { | 828 if (start < end) { |
| 805 PrintF("\n // %s\n", list_name); | 829 PrintF("\n // %s\n", list_name); |
| 806 if (nof_internal_slots > 0) { | 830 if (nof_internal_slots > 0) { |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 860 for (const auto& elem : descr->module_requests()) { | 884 for (const auto& elem : descr->module_requests()) { |
| 861 module_requests->set(elem.second, *elem.first->string()); | 885 module_requests->set(elem.second, *elem.first->string()); |
| 862 } | 886 } |
| 863 | 887 |
| 864 // Serialize special exports. | 888 // Serialize special exports. |
| 865 Handle<FixedArray> special_exports = | 889 Handle<FixedArray> special_exports = |
| 866 isolate->factory()->NewFixedArray(descr->special_exports().length()); | 890 isolate->factory()->NewFixedArray(descr->special_exports().length()); |
| 867 { | 891 { |
| 868 int i = 0; | 892 int i = 0; |
| 869 for (auto entry : descr->special_exports()) { | 893 for (auto entry : descr->special_exports()) { |
| 870 special_exports->set(i++, *entry->Serialize(isolate)); | 894 Handle<ModuleInfoEntry> serialized_entry = entry->Serialize(isolate); |
| 895 special_exports->set(i++, *serialized_entry); |
| 871 } | 896 } |
| 872 } | 897 } |
| 873 | 898 |
| 874 // Serialize namespace imports. | 899 // Serialize namespace imports. |
| 875 Handle<FixedArray> namespace_imports = | 900 Handle<FixedArray> namespace_imports = |
| 876 isolate->factory()->NewFixedArray(descr->namespace_imports().length()); | 901 isolate->factory()->NewFixedArray(descr->namespace_imports().length()); |
| 877 { | 902 { |
| 878 int i = 0; | 903 int i = 0; |
| 879 for (auto entry : descr->namespace_imports()) { | 904 for (auto entry : descr->namespace_imports()) { |
| 880 namespace_imports->set(i++, *entry->Serialize(isolate)); | 905 Handle<ModuleInfoEntry> serialized_entry = entry->Serialize(isolate); |
| 906 namespace_imports->set(i++, *serialized_entry); |
| 881 } | 907 } |
| 882 } | 908 } |
| 883 | 909 |
| 884 // Serialize regular exports. | 910 // Serialize regular exports. |
| 885 Handle<FixedArray> regular_exports = | 911 Handle<FixedArray> regular_exports = |
| 886 descr->SerializeRegularExports(isolate, zone); | 912 descr->SerializeRegularExports(isolate, zone); |
| 887 | 913 |
| 888 // Serialize regular imports. | 914 // Serialize regular imports. |
| 889 Handle<FixedArray> regular_imports = isolate->factory()->NewFixedArray( | 915 Handle<FixedArray> regular_imports = isolate->factory()->NewFixedArray( |
| 890 static_cast<int>(descr->regular_imports().size())); | 916 static_cast<int>(descr->regular_imports().size())); |
| 891 { | 917 { |
| 892 int i = 0; | 918 int i = 0; |
| 893 for (const auto& elem : descr->regular_imports()) { | 919 for (const auto& elem : descr->regular_imports()) { |
| 894 regular_imports->set(i++, *elem.second->Serialize(isolate)); | 920 Handle<ModuleInfoEntry> serialized_entry = |
| 921 elem.second->Serialize(isolate); |
| 922 regular_imports->set(i++, *serialized_entry); |
| 895 } | 923 } |
| 896 } | 924 } |
| 897 | 925 |
| 898 Handle<ModuleInfo> result = isolate->factory()->NewModuleInfo(); | 926 Handle<ModuleInfo> result = isolate->factory()->NewModuleInfo(); |
| 899 result->set(kModuleRequestsIndex, *module_requests); | 927 result->set(kModuleRequestsIndex, *module_requests); |
| 900 result->set(kSpecialExportsIndex, *special_exports); | 928 result->set(kSpecialExportsIndex, *special_exports); |
| 901 result->set(kRegularExportsIndex, *regular_exports); | 929 result->set(kRegularExportsIndex, *regular_exports); |
| 902 result->set(kNamespaceImportsIndex, *namespace_imports); | 930 result->set(kNamespaceImportsIndex, *namespace_imports); |
| 903 result->set(kRegularImportsIndex, *regular_imports); | 931 result->set(kRegularImportsIndex, *regular_imports); |
| 904 return result; | 932 return result; |
| 905 } | 933 } |
| 906 | 934 |
| 935 Handle<ModuleInfoEntry> ModuleInfo::LookupRegularImport( |
| 936 Handle<ModuleInfo> info, Handle<String> local_name) { |
| 937 Isolate* isolate = info->GetIsolate(); |
| 938 Handle<FixedArray> regular_imports(info->regular_imports(), isolate); |
| 939 for (int i = 0, n = regular_imports->length(); i < n; ++i) { |
| 940 Handle<ModuleInfoEntry> entry( |
| 941 ModuleInfoEntry::cast(regular_imports->get(i)), isolate); |
| 942 if (String::cast(entry->local_name())->Equals(*local_name)) { |
| 943 return entry; |
| 944 } |
| 945 } |
| 946 UNREACHABLE(); |
| 947 return Handle<ModuleInfoEntry>(); |
| 948 } |
| 949 |
| 907 } // namespace internal | 950 } // namespace internal |
| 908 } // namespace v8 | 951 } // namespace v8 |
| OLD | NEW |