| Index: src/ast/modules.h
|
| diff --git a/src/ast/modules.h b/src/ast/modules.h
|
| index bdc31b24e630c288fc6eb1f732270797f85f7ee9..563c1259374d5f5188ccbaa89efef0558e8312a4 100644
|
| --- a/src/ast/modules.h
|
| +++ b/src/ast/modules.h
|
| @@ -19,7 +19,8 @@ class ModuleInfoEntry;
|
| class ModuleDescriptor : public ZoneObject {
|
| public:
|
| explicit ModuleDescriptor(Zone* zone)
|
| - : special_exports_(1, zone),
|
| + : module_requests_(zone),
|
| + special_exports_(1, zone),
|
| special_imports_(1, zone),
|
| regular_exports_(zone),
|
| regular_imports_(zone) {}
|
| @@ -78,7 +79,11 @@ class ModuleDescriptor : public ZoneObject {
|
| const AstRawString* export_name;
|
| const AstRawString* local_name;
|
| const AstRawString* import_name;
|
| - const AstRawString* module_request;
|
| + // The module_request value records the order in which modules are
|
| + // requested. It also functions as an index into the ModuleInfo's array of
|
| + // module specifiers and into the Module's array of requested modules. A
|
| + // negative value means no module request.
|
| + int module_request;
|
|
|
| // TODO(neis): Remove local_name component?
|
| explicit Entry(Scanner::Location loc)
|
| @@ -86,7 +91,7 @@ class ModuleDescriptor : public ZoneObject {
|
| export_name(nullptr),
|
| local_name(nullptr),
|
| import_name(nullptr),
|
| - module_request(nullptr) {}
|
| + module_request(-1) {}
|
|
|
| // (De-)serialization support.
|
| // Note that the location value is not preserved as it's only needed by the
|
| @@ -96,6 +101,11 @@ class ModuleDescriptor : public ZoneObject {
|
| Handle<ModuleInfoEntry> entry);
|
| };
|
|
|
| + // Module requests.
|
| + const ZoneMap<const AstRawString*, int>& module_requests() const {
|
| + return module_requests_;
|
| + }
|
| +
|
| // Empty imports and namespace imports.
|
| const ZoneList<const Entry*>& special_imports() const {
|
| return special_imports_;
|
| @@ -120,32 +130,34 @@ class ModuleDescriptor : public ZoneObject {
|
| DCHECK_NOT_NULL(entry->export_name);
|
| DCHECK_NOT_NULL(entry->local_name);
|
| DCHECK_NULL(entry->import_name);
|
| + DCHECK_LT(entry->module_request, 0);
|
| regular_exports_.insert(std::make_pair(entry->local_name, entry));
|
| }
|
|
|
| void AddSpecialExport(const Entry* entry, Zone* zone) {
|
| - DCHECK_NOT_NULL(entry->module_request);
|
| + DCHECK_LE(0, entry->module_request);
|
| special_exports_.Add(entry, zone);
|
| }
|
|
|
| void AddRegularImport(const Entry* entry) {
|
| DCHECK_NOT_NULL(entry->import_name);
|
| DCHECK_NOT_NULL(entry->local_name);
|
| - DCHECK_NOT_NULL(entry->module_request);
|
| DCHECK_NULL(entry->export_name);
|
| + DCHECK_LE(0, entry->module_request);
|
| regular_imports_.insert(std::make_pair(entry->local_name, entry));
|
| // We don't care if there's already an entry for this local name, as in that
|
| // case we will report an error when declaring the variable.
|
| }
|
|
|
| void AddSpecialImport(const Entry* entry, Zone* zone) {
|
| - DCHECK_NOT_NULL(entry->module_request);
|
| DCHECK_NULL(entry->export_name);
|
| + DCHECK_LE(0, entry->module_request);
|
| special_imports_.Add(entry, zone);
|
| }
|
|
|
| private:
|
| // TODO(neis): Use STL datastructure instead of ZoneList?
|
| + ZoneMap<const AstRawString*, int> module_requests_;
|
| ZoneList<const Entry*> special_exports_;
|
| ZoneList<const Entry*> special_imports_;
|
| ZoneMultimap<const AstRawString*, Entry*> regular_exports_;
|
| @@ -172,6 +184,14 @@ class ModuleDescriptor : public ZoneObject {
|
| // import {a as b} from "X"; export {a as c} from "X";
|
| // (The import entry is never deleted.)
|
| void MakeIndirectExportsExplicit(Zone* zone);
|
| +
|
| + int AddModuleRequest(const AstRawString* specifier) {
|
| + DCHECK_NOT_NULL(specifier);
|
| + auto it = module_requests_
|
| + .insert(std::make_pair(specifier, module_requests_.size()))
|
| + .first;
|
| + return it->second;
|
| + }
|
| };
|
|
|
| } // namespace internal
|
|
|