| Index: src/ast/modules.cc
|
| diff --git a/src/ast/modules.cc b/src/ast/modules.cc
|
| index e2881aaf9fea037ac92644a2299fc8a6af0a40c9..d1ba4cd2475b4c70246cdfb53c34a25cd5d82488 100644
|
| --- a/src/ast/modules.cc
|
| +++ b/src/ast/modules.cc
|
| @@ -112,55 +112,61 @@ Handle<FixedArray> ModuleDescriptor::SerializeRegularExports(Isolate* isolate,
|
| // local names and for each local name immediately access all its export
|
| // names. (Regular exports have neither import name nor module request.)
|
|
|
| - ZoneVector<Handle<Object>> data(zone);
|
| - data.reserve(3 * regular_exports_.size());
|
| + ZoneVector<Handle<Object>> data(
|
| + ModuleInfo::kRegularExportLength * regular_exports_.size(), zone);
|
| + int index = 0;
|
|
|
| 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;
|
| + int count = 0;
|
| do {
|
| DCHECK_EQ(it->second->local_name, next->second->local_name);
|
| DCHECK_EQ(it->second->cell_index, next->second->cell_index);
|
| ++next;
|
| - ++size;
|
| + ++count;
|
| } 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);
|
| + Handle<FixedArray> export_names = isolate->factory()->NewFixedArray(count);
|
| + data[index + ModuleInfo::kRegularExportLocalNameOffset] =
|
| + it->second->local_name->string();
|
| + data[index + ModuleInfo::kRegularExportCellIndexOffset] =
|
| + handle(Smi::FromInt(it->second->cell_index), isolate);
|
| + data[index + ModuleInfo::kRegularExportExportNamesOffset] = export_names;
|
| + index += ModuleInfo::kRegularExportLength;
|
|
|
| // Collect the export names.
|
| int i = 0;
|
| for (; it != next; ++it) {
|
| export_names->set(i++, *it->second->export_name->string());
|
| }
|
| - DCHECK_EQ(i, size);
|
| + DCHECK_EQ(i, count);
|
|
|
| // Continue with the next distinct key.
|
| DCHECK(it == next);
|
| }
|
| + DCHECK_LE(index, static_cast<int>(data.size()));
|
| + data.resize(index);
|
|
|
| // We cannot create the FixedArray earlier because we only now know the
|
| - // precise size (the number of unique keys in regular_exports).
|
| - int size = static_cast<int>(data.size());
|
| - Handle<FixedArray> result = isolate->factory()->NewFixedArray(size);
|
| - for (int i = 0; i < size; ++i) {
|
| + // precise size.
|
| + Handle<FixedArray> result = isolate->factory()->NewFixedArray(index);
|
| + for (int i = 0; i < index; ++i) {
|
| result->set(i, *data[i]);
|
| }
|
| return result;
|
| }
|
|
|
| -void ModuleDescriptor::DeserializeRegularExports(Isolate* isolate,
|
| - AstValueFactory* avfactory,
|
| - 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) {
|
| +void ModuleDescriptor::DeserializeRegularExports(
|
| + Isolate* isolate, AstValueFactory* avfactory,
|
| + Handle<ModuleInfo> module_info) {
|
| + for (int i = 0, count = module_info->RegularExportCount(); i < count; ++i) {
|
| + Handle<String> local_name(module_info->RegularExportLocalName(i), isolate);
|
| + int cell_index = module_info->RegularExportCellIndex(i);
|
| + Handle<FixedArray> export_names(module_info->RegularExportExportNames(i),
|
| + isolate);
|
| +
|
| + for (int j = 0, length = export_names->length(); j < length; ++j) {
|
| Handle<String> export_name(String::cast(export_names->get(j)), isolate);
|
|
|
| Entry* entry =
|
|
|