Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1)

Side by Side Diff: src/objects.cc

Issue 2465283004: [modules] Maintain array of cells for imports and local exports. (Closed)
Patch Set: Various changes. Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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
OLDNEW
« src/objects.h ('K') | « src/objects.h ('k') | src/objects-inl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698