1// Copyright 2012 the V8 project authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef V8_AST_MODULES_H_
6#define V8_AST_MODULES_H_
7
8#include "src/zone.h"
9
10namespace v8 {
11namespace internal {
12
13
14class AstRawString;
15
16
17class ModuleDescriptor : public ZoneObject {
18 public:
19  // ---------------------------------------------------------------------------
20  // Factory methods.
21
22  static ModuleDescriptor* New(Zone* zone) {
23    return new (zone) ModuleDescriptor(zone);
24  }
25
26  // ---------------------------------------------------------------------------
27  // Mutators.
28
29  // Add a name to the list of exports. If it already exists, that's an error.
30  void AddLocalExport(const AstRawString* export_name,
31                      const AstRawString* local_name, Zone* zone, bool* ok);
32
33  // Add module_specifier to the list of requested modules,
34  // if not already present.
35  void AddModuleRequest(const AstRawString* module_specifier, Zone* zone);
36
37  // Assign an index.
38  void Allocate(int index) {
39    DCHECK_EQ(-1, index_);
40    index_ = index;
41  }
42
43  // ---------------------------------------------------------------------------
44  // Accessors.
45
46  int Length() {
47    ZoneHashMap* exports = exports_;
48    return exports ? exports->occupancy() : 0;
49  }
50
51  // The context slot in the hosting script context pointing to this module.
52  int Index() {
53    return index_;
54  }
55
56  const AstRawString* LookupLocalExport(const AstRawString* export_name,
57                                        Zone* zone);
58
59  const ZoneList<const AstRawString*>& requested_modules() const {
60    return requested_modules_;
61  }
62
63  // ---------------------------------------------------------------------------
64  // Iterators.
65
66  // Use like:
67  //   for (auto it = descriptor->iterator(); !it.done(); it.Advance()) {
68  //     ... it.name() ...
69  //   }
70  class Iterator {
71   public:
72    bool done() const { return entry_ == NULL; }
73    const AstRawString* export_name() const {
74      DCHECK(!done());
75      return static_cast<const AstRawString*>(entry_->key);
76    }
77    const AstRawString* local_name() const {
78      DCHECK(!done());
79      return static_cast<const AstRawString*>(entry_->value);
80    }
81    void Advance() { entry_ = exports_->Next(entry_); }
82
83   private:
84    friend class ModuleDescriptor;
85    explicit Iterator(const ZoneHashMap* exports)
86        : exports_(exports), entry_(exports ? exports->Start() : NULL) {}
87
88    const ZoneHashMap* exports_;
89    ZoneHashMap::Entry* entry_;
90  };
91
92  Iterator iterator() const { return Iterator(this->exports_); }
93
94  // ---------------------------------------------------------------------------
95  // Implementation.
96 private:
97  explicit ModuleDescriptor(Zone* zone)
98      : exports_(NULL), requested_modules_(1, zone), index_(-1) {}
99
100  ZoneHashMap* exports_;   // Module exports and their types (allocated lazily)
101  ZoneList<const AstRawString*> requested_modules_;
102  int index_;
103};
104
105}  // namespace internal
106}  // namespace v8
107
108#endif  // V8_AST_MODULES_H_
109