OLD | NEW |
---|---|
1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 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/objects.h" | 5 #include "src/objects.h" |
6 | 6 |
7 #include <cmath> | 7 #include <cmath> |
8 #include <iomanip> | 8 #include <iomanip> |
9 #include <memory> | 9 #include <memory> |
10 #include <sstream> | 10 #include <sstream> |
(...skipping 19798 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
19809 zone_allocator< | 19809 zone_allocator< |
19810 std::pair<const Handle<Module>, UnorderedStringSet*>>(zone)), | 19810 std::pair<const Handle<Module>, UnorderedStringSet*>>(zone)), |
19811 zone_(zone) {} | 19811 zone_(zone) {} |
19812 | 19812 |
19813 Zone* zone() const { return zone_; } | 19813 Zone* zone() const { return zone_; } |
19814 | 19814 |
19815 private: | 19815 private: |
19816 Zone* zone_; | 19816 Zone* zone_; |
19817 }; | 19817 }; |
19818 | 19818 |
19819 namespace { | |
19820 | |
19821 int ExportIndex(int cell_index) { | |
19822 DCHECK_EQ(ModuleDescriptor::cell_index_kind(cell_index), | |
19823 ModuleDescriptor::kExport); | |
19824 return cell_index - 1; | |
19825 } | |
19826 | |
19827 int ImportIndex(int cell_index) { | |
19828 DCHECK_EQ(ModuleDescriptor::cell_index_kind(cell_index), | |
19829 ModuleDescriptor::kImport); | |
19830 return -cell_index - 1; | |
19831 } | |
19832 | |
19833 } // anonymous namespace | |
19834 | |
19819 void Module::CreateIndirectExport(Handle<Module> module, Handle<String> name, | 19835 void Module::CreateIndirectExport(Handle<Module> module, Handle<String> name, |
19820 Handle<ModuleInfoEntry> entry) { | 19836 Handle<ModuleInfoEntry> entry) { |
19821 Isolate* isolate = module->GetIsolate(); | 19837 Isolate* isolate = module->GetIsolate(); |
19822 Handle<ObjectHashTable> exports(module->exports(), isolate); | 19838 Handle<ObjectHashTable> exports(module->exports(), isolate); |
19823 DCHECK(exports->Lookup(name)->IsTheHole(isolate)); | 19839 DCHECK(exports->Lookup(name)->IsTheHole(isolate)); |
19824 exports = ObjectHashTable::Put(exports, name, entry); | 19840 exports = ObjectHashTable::Put(exports, name, entry); |
19825 module->set_exports(*exports); | 19841 module->set_exports(*exports); |
19826 } | 19842 } |
19827 | 19843 |
19828 void Module::CreateExport(Handle<Module> module, Handle<FixedArray> names) { | 19844 void Module::CreateExport(Handle<Module> module, int index, |
adamk
2016/11/03 18:30:45
Curious why you sometimes say "index" and sometime
neis
2016/11/04 10:14:39
Not here at least. Changed these to cell_index.
| |
19845 Handle<FixedArray> names) { | |
19829 DCHECK_LT(0, names->length()); | 19846 DCHECK_LT(0, names->length()); |
19830 Isolate* isolate = module->GetIsolate(); | 19847 Isolate* isolate = module->GetIsolate(); |
19848 | |
19831 Handle<Cell> cell = | 19849 Handle<Cell> cell = |
19832 isolate->factory()->NewCell(isolate->factory()->undefined_value()); | 19850 isolate->factory()->NewCell(isolate->factory()->undefined_value()); |
19851 module->regular_exports()->set(ExportIndex(index), *cell); | |
19852 | |
19833 Handle<ObjectHashTable> exports(module->exports(), isolate); | 19853 Handle<ObjectHashTable> exports(module->exports(), isolate); |
19834 for (int i = 0, n = names->length(); i < n; ++i) { | 19854 for (int i = 0, n = names->length(); i < n; ++i) { |
19835 Handle<String> name(String::cast(names->get(i)), isolate); | 19855 Handle<String> name(String::cast(names->get(i)), isolate); |
19836 DCHECK(exports->Lookup(name)->IsTheHole(isolate)); | 19856 DCHECK(exports->Lookup(name)->IsTheHole(isolate)); |
19837 exports = ObjectHashTable::Put(exports, name, cell); | 19857 exports = ObjectHashTable::Put(exports, name, cell); |
19838 } | 19858 } |
19839 module->set_exports(*exports); | 19859 module->set_exports(*exports); |
19840 } | 19860 } |
19841 | 19861 |
19842 void Module::StoreExport(Handle<Module> module, Handle<String> name, | 19862 Handle<Object> Module::LoadVariable(Handle<Module> module, int index) { |
19843 Handle<Object> value) { | |
19844 Handle<Cell> cell(Cell::cast(module->exports()->Lookup(name))); | |
19845 cell->set_value(*value); | |
19846 } | |
19847 | |
19848 Handle<Object> Module::LoadExport(Handle<Module> module, Handle<String> name) { | |
19849 Isolate* isolate = module->GetIsolate(); | 19863 Isolate* isolate = module->GetIsolate(); |
19850 Handle<Object> object(module->exports()->Lookup(name), isolate); | 19864 Handle<Object> object; |
19865 switch (ModuleDescriptor::cell_index_kind(index)) { | |
19866 case ModuleDescriptor::kImport: | |
19867 object = | |
19868 handle(module->regular_imports()->get(ImportIndex(index)), isolate); | |
19869 break; | |
19870 case ModuleDescriptor::kExport: | |
19871 object = | |
19872 handle(module->regular_exports()->get(ExportIndex(index)), isolate); | |
19873 break; | |
19874 case ModuleDescriptor::kInvalid: | |
19875 UNREACHABLE(); | |
19876 break; | |
19877 } | |
19851 return handle(Handle<Cell>::cast(object)->value(), isolate); | 19878 return handle(Handle<Cell>::cast(object)->value(), isolate); |
19852 } | 19879 } |
19853 | 19880 |
19854 Handle<Object> Module::LoadImport(Handle<Module> module, Handle<String> name, | 19881 void Module::StoreVariable(Handle<Module> module, int index, |
19855 int module_request) { | 19882 Handle<Object> value) { |
19856 Isolate* isolate = module->GetIsolate(); | 19883 Isolate* isolate = module->GetIsolate(); |
19857 Handle<Module> requested_module( | 19884 DCHECK_EQ(ModuleDescriptor::cell_index_kind(index), |
19858 Module::cast(module->requested_modules()->get(module_request)), isolate); | 19885 ModuleDescriptor::kExport); |
19859 return Module::LoadExport(requested_module, name); | 19886 Handle<Object> object(module->regular_exports()->get(ExportIndex(index)), |
19887 isolate); | |
19888 Handle<Cell>::cast(object)->set_value(*value); | |
19860 } | 19889 } |
19861 | 19890 |
19862 MaybeHandle<Cell> Module::ResolveImport(Handle<Module> module, | 19891 MaybeHandle<Cell> Module::ResolveImport(Handle<Module> module, |
19863 Handle<String> name, int module_request, | 19892 Handle<String> name, int module_request, |
19864 MessageLocation loc, bool must_resolve, | 19893 MessageLocation loc, bool must_resolve, |
19865 Module::ResolveSet* resolve_set) { | 19894 Module::ResolveSet* resolve_set) { |
19866 Isolate* isolate = module->GetIsolate(); | 19895 Isolate* isolate = module->GetIsolate(); |
19867 Handle<Module> requested_module( | 19896 Handle<Module> requested_module( |
19868 Module::cast(module->requested_modules()->get(module_request)), isolate); | 19897 Module::cast(module->requested_modules()->get(module_request)), isolate); |
19869 return Module::ResolveExport(requested_module, name, loc, must_resolve, | 19898 return Module::ResolveExport(requested_module, name, loc, must_resolve, |
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
20004 isolate->factory()->NewFunctionFromSharedFunctionInfo( | 20033 isolate->factory()->NewFunctionFromSharedFunctionInfo( |
20005 shared, | 20034 shared, |
20006 handle(Utils::OpenHandle(*context)->native_context(), isolate)); | 20035 handle(Utils::OpenHandle(*context)->native_context(), isolate)); |
20007 module->set_code(*function); | 20036 module->set_code(*function); |
20008 DCHECK(module->instantiated()); | 20037 DCHECK(module->instantiated()); |
20009 | 20038 |
20010 Handle<ModuleInfo> module_info(shared->scope_info()->ModuleDescriptorInfo(), | 20039 Handle<ModuleInfo> module_info(shared->scope_info()->ModuleDescriptorInfo(), |
20011 isolate); | 20040 isolate); |
20012 | 20041 |
20013 // Set up local exports. | 20042 // Set up local exports. |
20043 // TODO(neis): Create regular_exports array here instead of in factory method? | |
20014 for (int i = 0, n = module_info->RegularExportCount(); i < n; ++i) { | 20044 for (int i = 0, n = module_info->RegularExportCount(); i < n; ++i) { |
20045 int cell_index = module_info->RegularExportCellIndex(i); | |
20015 Handle<FixedArray> export_names(module_info->RegularExportExportNames(i), | 20046 Handle<FixedArray> export_names(module_info->RegularExportExportNames(i), |
20016 isolate); | 20047 isolate); |
20017 CreateExport(module, export_names); | 20048 CreateExport(module, cell_index, export_names); |
20018 } | 20049 } |
20019 | 20050 |
20020 // Partially set up indirect exports. | 20051 // Partially set up indirect exports. |
20021 // For each indirect export, we create the appropriate slot in the export | 20052 // For each indirect export, we create the appropriate slot in the export |
20022 // table and store its ModuleInfoEntry there. When we later find the correct | 20053 // table and store its ModuleInfoEntry there. When we later find the correct |
20023 // Cell in the module that actually provides the value, we replace the | 20054 // Cell in the module that actually provides the value, we replace the |
20024 // ModuleInfoEntry by that Cell (see ResolveExport). | 20055 // ModuleInfoEntry by that Cell (see ResolveExport). |
20025 Handle<FixedArray> special_exports(module_info->special_exports(), isolate); | 20056 Handle<FixedArray> special_exports(module_info->special_exports(), isolate); |
20026 for (int i = 0, n = special_exports->length(); i < n; ++i) { | 20057 for (int i = 0, n = special_exports->length(); i < n; ++i) { |
20027 Handle<ModuleInfoEntry> entry( | 20058 Handle<ModuleInfoEntry> entry( |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
20059 Handle<FixedArray> regular_imports(module_info->regular_imports(), isolate); | 20090 Handle<FixedArray> regular_imports(module_info->regular_imports(), isolate); |
20060 for (int i = 0, n = regular_imports->length(); i < n; ++i) { | 20091 for (int i = 0, n = regular_imports->length(); i < n; ++i) { |
20061 Handle<ModuleInfoEntry> entry( | 20092 Handle<ModuleInfoEntry> entry( |
20062 ModuleInfoEntry::cast(regular_imports->get(i)), isolate); | 20093 ModuleInfoEntry::cast(regular_imports->get(i)), isolate); |
20063 Handle<String> name(String::cast(entry->import_name()), isolate); | 20094 Handle<String> name(String::cast(entry->import_name()), isolate); |
20064 Handle<Script> script( | 20095 Handle<Script> script( |
20065 Script::cast(JSFunction::cast(module->code())->shared()->script()), | 20096 Script::cast(JSFunction::cast(module->code())->shared()->script()), |
20066 isolate); | 20097 isolate); |
20067 MessageLocation loc(script, entry->beg_pos(), entry->end_pos()); | 20098 MessageLocation loc(script, entry->beg_pos(), entry->end_pos()); |
20068 ResolveSet resolve_set(&zone); | 20099 ResolveSet resolve_set(&zone); |
20069 if (ResolveImport(module, name, entry->module_request(), loc, true, | 20100 Handle<Cell> cell; |
20070 &resolve_set) | 20101 if (!ResolveImport(module, name, entry->module_request(), loc, true, |
20071 .is_null()) { | 20102 &resolve_set) |
20103 .ToHandle(&cell)) { | |
20072 return false; | 20104 return false; |
20073 } | 20105 } |
20106 module->regular_imports()->set(ImportIndex(entry->cell_index()), *cell); | |
20074 } | 20107 } |
20075 | 20108 |
20076 // Resolve indirect exports. | 20109 // Resolve indirect exports. |
20077 for (int i = 0, n = special_exports->length(); i < n; ++i) { | 20110 for (int i = 0, n = special_exports->length(); i < n; ++i) { |
20078 Handle<ModuleInfoEntry> entry( | 20111 Handle<ModuleInfoEntry> entry( |
20079 ModuleInfoEntry::cast(special_exports->get(i)), isolate); | 20112 ModuleInfoEntry::cast(special_exports->get(i)), isolate); |
20080 Handle<Object> name(entry->export_name(), isolate); | 20113 Handle<Object> name(entry->export_name(), isolate); |
20081 if (name->IsUndefined(isolate)) continue; // Star export. | 20114 if (name->IsUndefined(isolate)) continue; // Star export. |
20082 Handle<Script> script( | 20115 Handle<Script> script( |
20083 Script::cast(JSFunction::cast(module->code())->shared()->script()), | 20116 Script::cast(JSFunction::cast(module->code())->shared()->script()), |
(...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
20253 ns, Accessors::ModuleNamespaceEntryInfo(isolate, name, attr)) | 20286 ns, Accessors::ModuleNamespaceEntryInfo(isolate, name, attr)) |
20254 .Check(); | 20287 .Check(); |
20255 } | 20288 } |
20256 JSObject::PreventExtensions(ns, THROW_ON_ERROR).ToChecked(); | 20289 JSObject::PreventExtensions(ns, THROW_ON_ERROR).ToChecked(); |
20257 | 20290 |
20258 return ns; | 20291 return ns; |
20259 } | 20292 } |
20260 | 20293 |
20261 } // namespace internal | 20294 } // namespace internal |
20262 } // namespace v8 | 20295 } // namespace v8 |
OLD | NEW |