| // Copyright 2012 the V8 project authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef V8_AST_MODULES_H_ |
| #define V8_AST_MODULES_H_ |
| |
| #include "src/zone.h" |
| |
| namespace v8 { |
| namespace internal { |
| |
| |
| class AstRawString; |
| |
| |
| class ModuleDescriptor : public ZoneObject { |
| public: |
| // --------------------------------------------------------------------------- |
| // Factory methods. |
| |
| static ModuleDescriptor* New(Zone* zone) { |
| return new (zone) ModuleDescriptor(zone); |
| } |
| |
| // --------------------------------------------------------------------------- |
| // Mutators. |
| |
| // Add a name to the list of exports. If it already exists, that's an error. |
| void AddLocalExport(const AstRawString* export_name, |
| const AstRawString* local_name, Zone* zone, bool* ok); |
| |
| // Add module_specifier to the list of requested modules, |
| // if not already present. |
| void AddModuleRequest(const AstRawString* module_specifier, Zone* zone); |
| |
| // Assign an index. |
| void Allocate(int index) { |
| DCHECK_EQ(-1, index_); |
| index_ = index; |
| } |
| |
| // --------------------------------------------------------------------------- |
| // Accessors. |
| |
| int Length() { |
| ZoneHashMap* exports = exports_; |
| return exports ? exports->occupancy() : 0; |
| } |
| |
| // The context slot in the hosting script context pointing to this module. |
| int Index() { |
| return index_; |
| } |
| |
| const AstRawString* LookupLocalExport(const AstRawString* export_name, |
| Zone* zone); |
| |
| const ZoneList<const AstRawString*>& requested_modules() const { |
| return requested_modules_; |
| } |
| |
| // --------------------------------------------------------------------------- |
| // Iterators. |
| |
| // Use like: |
| // for (auto it = descriptor->iterator(); !it.done(); it.Advance()) { |
| // ... it.name() ... |
| // } |
| class Iterator { |
| public: |
| bool done() const { return entry_ == NULL; } |
| const AstRawString* export_name() const { |
| DCHECK(!done()); |
| return static_cast<const AstRawString*>(entry_->key); |
| } |
| const AstRawString* local_name() const { |
| DCHECK(!done()); |
| return static_cast<const AstRawString*>(entry_->value); |
| } |
| void Advance() { entry_ = exports_->Next(entry_); } |
| |
| private: |
| friend class ModuleDescriptor; |
| explicit Iterator(const ZoneHashMap* exports) |
| : exports_(exports), entry_(exports ? exports->Start() : NULL) {} |
| |
| const ZoneHashMap* exports_; |
| ZoneHashMap::Entry* entry_; |
| }; |
| |
| Iterator iterator() const { return Iterator(this->exports_); } |
| |
| // --------------------------------------------------------------------------- |
| // Implementation. |
| private: |
| explicit ModuleDescriptor(Zone* zone) |
| : exports_(NULL), requested_modules_(1, zone), index_(-1) {} |
| |
| ZoneHashMap* exports_; // Module exports and their types (allocated lazily) |
| ZoneList<const AstRawString*> requested_modules_; |
| int index_; |
| }; |
| |
| } // namespace internal |
| } // namespace v8 |
| |
| #endif // V8_AST_MODULES_H_ |