| Index: src/ast/modules.cc
|
| diff --git a/src/ast/modules.cc b/src/ast/modules.cc
|
| index 1c8ddf44fef35b2569f8cdb1524e9c4c0f766f3f..547b92cda2873f5d330b3f09f9db5a8911ad47a2 100644
|
| --- a/src/ast/modules.cc
|
| +++ b/src/ast/modules.cc
|
| @@ -87,9 +87,8 @@ Handle<ModuleInfoEntry> ModuleDescriptor::Entry::Serialize(
|
| return ModuleInfoEntry::New(
|
| isolate, ToStringOrUndefined(isolate, export_name),
|
| ToStringOrUndefined(isolate, local_name),
|
| - ToStringOrUndefined(isolate, import_name),
|
| - Handle<Object>(Smi::FromInt(module_request), isolate), location.beg_pos,
|
| - location.end_pos);
|
| + ToStringOrUndefined(isolate, import_name), module_request, cell_index,
|
| + location.beg_pos, location.end_pos);
|
| }
|
|
|
| ModuleDescriptor::Entry* ModuleDescriptor::Entry::Deserialize(
|
| @@ -102,7 +101,8 @@ ModuleDescriptor::Entry* ModuleDescriptor::Entry::Deserialize(
|
| isolate, avfactory, handle(entry->local_name(), isolate));
|
| result->import_name = FromStringOrUndefined(
|
| isolate, avfactory, handle(entry->import_name(), isolate));
|
| - result->module_request = Smi::cast(entry->module_request())->value();
|
| + result->module_request = entry->module_request();
|
| + result->cell_index = entry->cell_index();
|
| return result;
|
| }
|
|
|
| @@ -113,19 +113,22 @@ Handle<FixedArray> ModuleDescriptor::SerializeRegularExports(Isolate* isolate,
|
| // names. (Regular exports have neither import name nor module request.)
|
|
|
| ZoneVector<Handle<Object>> data(zone);
|
| - data.reserve(2 * regular_exports_.size());
|
| + data.reserve(3 * regular_exports_.size());
|
|
|
| for (auto it = regular_exports_.begin(); it != regular_exports_.end();) {
|
| // Find out how many export names this local name has.
|
| auto next = it;
|
| int size = 0;
|
| do {
|
| + DCHECK_EQ(it->second->local_name, next->second->local_name);
|
| + DCHECK_EQ(it->second->cell_index, next->second->cell_index);
|
| ++next;
|
| ++size;
|
| } while (next != regular_exports_.end() && next->first == it->first);
|
|
|
| Handle<FixedArray> export_names = isolate->factory()->NewFixedArray(size);
|
| data.push_back(it->second->local_name->string());
|
| + data.push_back(handle(Smi::FromInt(it->second->cell_index), isolate));
|
| data.push_back(export_names);
|
|
|
| // Collect the export names.
|
| @@ -154,6 +157,7 @@ void ModuleDescriptor::DeserializeRegularExports(Isolate* isolate,
|
| Handle<FixedArray> data) {
|
| for (int i = 0, length_i = data->length(); i < length_i;) {
|
| Handle<String> local_name(String::cast(data->get(i++)), isolate);
|
| + int cell_index = Smi::cast(data->get(i++))->value();
|
| Handle<FixedArray> export_names(FixedArray::cast(data->get(i++)), isolate);
|
|
|
| for (int j = 0, length_j = export_names->length(); j < length_j; ++j) {
|
| @@ -163,6 +167,7 @@ void ModuleDescriptor::DeserializeRegularExports(Isolate* isolate,
|
| new (avfactory->zone()) Entry(Scanner::Location::invalid());
|
| entry->local_name = avfactory->GetString(local_name);
|
| entry->export_name = avfactory->GetString(export_name);
|
| + entry->cell_index = cell_index;
|
|
|
| AddRegularExport(entry);
|
| }
|
| @@ -201,6 +206,36 @@ void ModuleDescriptor::MakeIndirectExportsExplicit(Zone* zone) {
|
| }
|
| }
|
|
|
| +void ModuleDescriptor::AssignCellIndices() {
|
| + int export_index = 1;
|
| + for (auto it = regular_exports_.begin(); it != regular_exports_.end();) {
|
| + auto current_key = it->first;
|
| + // This local name may be exported under multiple export names. Assign the
|
| + // same index to each such entry.
|
| + do {
|
| + Entry* entry = it->second;
|
| + DCHECK_NOT_NULL(entry->local_name);
|
| + DCHECK_NULL(entry->import_name);
|
| + DCHECK_LT(entry->module_request, 0);
|
| + DCHECK_EQ(entry->cell_index, 0);
|
| + entry->cell_index = export_index;
|
| + it++;
|
| + } while (it != regular_exports_.end() && it->first == current_key);
|
| + export_index++;
|
| + }
|
| +
|
| + int import_index = -1;
|
| + for (const auto& elem : regular_imports_) {
|
| + Entry* entry = elem.second;
|
| + DCHECK_NOT_NULL(entry->local_name);
|
| + DCHECK_NOT_NULL(entry->import_name);
|
| + DCHECK_LE(0, entry->module_request);
|
| + DCHECK_EQ(entry->cell_index, 0);
|
| + entry->cell_index = import_index;
|
| + import_index--;
|
| + }
|
| +}
|
| +
|
| namespace {
|
|
|
| const ModuleDescriptor::Entry* BetterDuplicate(
|
| @@ -267,6 +302,7 @@ bool ModuleDescriptor::Validate(ModuleScope* module_scope,
|
| }
|
|
|
| MakeIndirectExportsExplicit(zone);
|
| + AssignCellIndices();
|
| return true;
|
| }
|
|
|
|
|