| Index: src/objects.cc
|
| diff --git a/src/objects.cc b/src/objects.cc
|
| index ad4ebea02274ca5022a7b1d4627849e8e0e4fdeb..f5c8693d50f248a2ebff0279cecfede4d496f9ac 100644
|
| --- a/src/objects.cc
|
| +++ b/src/objects.cc
|
| @@ -19826,6 +19826,22 @@ class Module::ResolveSet
|
| Zone* zone_;
|
| };
|
|
|
| +namespace {
|
| +
|
| +int ExportIndex(int cell_index) {
|
| + DCHECK_EQ(ModuleDescriptor::GetCellIndexKind(cell_index),
|
| + ModuleDescriptor::kExport);
|
| + return cell_index - 1;
|
| +}
|
| +
|
| +int ImportIndex(int cell_index) {
|
| + DCHECK_EQ(ModuleDescriptor::GetCellIndexKind(cell_index),
|
| + ModuleDescriptor::kImport);
|
| + return -cell_index - 1;
|
| +}
|
| +
|
| +} // anonymous namespace
|
| +
|
| void Module::CreateIndirectExport(Handle<Module> module, Handle<String> name,
|
| Handle<ModuleInfoEntry> entry) {
|
| Isolate* isolate = module->GetIsolate();
|
| @@ -19835,11 +19851,15 @@ void Module::CreateIndirectExport(Handle<Module> module, Handle<String> name,
|
| module->set_exports(*exports);
|
| }
|
|
|
| -void Module::CreateExport(Handle<Module> module, Handle<FixedArray> names) {
|
| +void Module::CreateExport(Handle<Module> module, int cell_index,
|
| + Handle<FixedArray> names) {
|
| DCHECK_LT(0, names->length());
|
| Isolate* isolate = module->GetIsolate();
|
| +
|
| Handle<Cell> cell =
|
| isolate->factory()->NewCell(isolate->factory()->undefined_value());
|
| + module->regular_exports()->set(ExportIndex(cell_index), *cell);
|
| +
|
| Handle<ObjectHashTable> exports(module->exports(), isolate);
|
| for (int i = 0, n = names->length(); i < n; ++i) {
|
| Handle<String> name(String::cast(names->get(i)), isolate);
|
| @@ -19849,24 +19869,33 @@ void Module::CreateExport(Handle<Module> module, Handle<FixedArray> names) {
|
| module->set_exports(*exports);
|
| }
|
|
|
| -void Module::StoreExport(Handle<Module> module, Handle<String> name,
|
| - Handle<Object> value) {
|
| - Handle<Cell> cell(Cell::cast(module->exports()->Lookup(name)));
|
| - cell->set_value(*value);
|
| -}
|
| -
|
| -Handle<Object> Module::LoadExport(Handle<Module> module, Handle<String> name) {
|
| +Handle<Object> Module::LoadVariable(Handle<Module> module, int cell_index) {
|
| Isolate* isolate = module->GetIsolate();
|
| - Handle<Object> object(module->exports()->Lookup(name), isolate);
|
| + Handle<Object> object;
|
| + switch (ModuleDescriptor::GetCellIndexKind(cell_index)) {
|
| + case ModuleDescriptor::kImport:
|
| + object = handle(module->regular_imports()->get(ImportIndex(cell_index)),
|
| + isolate);
|
| + break;
|
| + case ModuleDescriptor::kExport:
|
| + object = handle(module->regular_exports()->get(ExportIndex(cell_index)),
|
| + isolate);
|
| + break;
|
| + case ModuleDescriptor::kInvalid:
|
| + UNREACHABLE();
|
| + break;
|
| + }
|
| return handle(Handle<Cell>::cast(object)->value(), isolate);
|
| }
|
|
|
| -Handle<Object> Module::LoadImport(Handle<Module> module, Handle<String> name,
|
| - int module_request) {
|
| +void Module::StoreVariable(Handle<Module> module, int cell_index,
|
| + Handle<Object> value) {
|
| Isolate* isolate = module->GetIsolate();
|
| - Handle<Module> requested_module(
|
| - Module::cast(module->requested_modules()->get(module_request)), isolate);
|
| - return Module::LoadExport(requested_module, name);
|
| + DCHECK_EQ(ModuleDescriptor::GetCellIndexKind(cell_index),
|
| + ModuleDescriptor::kExport);
|
| + Handle<Object> object(module->regular_exports()->get(ExportIndex(cell_index)),
|
| + isolate);
|
| + Handle<Cell>::cast(object)->set_value(*value);
|
| }
|
|
|
| MaybeHandle<Cell> Module::ResolveImport(Handle<Module> module,
|
| @@ -20021,10 +20050,12 @@ bool Module::Instantiate(Handle<Module> module, v8::Local<v8::Context> context,
|
| isolate);
|
|
|
| // Set up local exports.
|
| + // TODO(neis): Create regular_exports array here instead of in factory method?
|
| for (int i = 0, n = module_info->RegularExportCount(); i < n; ++i) {
|
| + int cell_index = module_info->RegularExportCellIndex(i);
|
| Handle<FixedArray> export_names(module_info->RegularExportExportNames(i),
|
| isolate);
|
| - CreateExport(module, export_names);
|
| + CreateExport(module, cell_index, export_names);
|
| }
|
|
|
| // Partially set up indirect exports.
|
| @@ -20076,11 +20107,13 @@ bool Module::Instantiate(Handle<Module> module, v8::Local<v8::Context> context,
|
| isolate);
|
| MessageLocation loc(script, entry->beg_pos(), entry->end_pos());
|
| ResolveSet resolve_set(&zone);
|
| - if (ResolveImport(module, name, entry->module_request(), loc, true,
|
| - &resolve_set)
|
| - .is_null()) {
|
| + Handle<Cell> cell;
|
| + if (!ResolveImport(module, name, entry->module_request(), loc, true,
|
| + &resolve_set)
|
| + .ToHandle(&cell)) {
|
| return false;
|
| }
|
| + module->regular_imports()->set(ImportIndex(entry->cell_index()), *cell);
|
| }
|
|
|
| // Resolve indirect exports.
|
|
|