OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef V8_AST_MODULES_H_ | 5 #ifndef V8_AST_MODULES_H_ |
6 #define V8_AST_MODULES_H_ | 6 #define V8_AST_MODULES_H_ |
7 | 7 |
8 #include "src/zone.h" | 8 #include "src/zone.h" |
9 | 9 |
10 namespace v8 { | 10 namespace v8 { |
11 namespace internal { | 11 namespace internal { |
12 | 12 |
13 | 13 |
14 class AstRawString; | 14 class AstRawString; |
15 | 15 |
16 | 16 |
17 class ModuleDescriptor : public ZoneObject { | 17 class ModuleDescriptor : public ZoneObject { |
18 public: | 18 public: |
19 // --------------------------------------------------------------------------- | 19 // --------------------------------------------------------------------------- |
20 // Factory methods. | 20 // Factory methods. |
21 | 21 |
22 static ModuleDescriptor* New(Zone* zone) { | 22 static ModuleDescriptor* New(Zone* zone) { |
23 return new (zone) ModuleDescriptor(zone); | 23 return new (zone) ModuleDescriptor(zone); |
24 } | 24 } |
25 | 25 |
26 // --------------------------------------------------------------------------- | 26 // --------------------------------------------------------------------------- |
27 // Mutators. | 27 // Mutators. |
28 | 28 |
29 // Add a name to the list of exports. If it already exists, or this descriptor | 29 // Add a name to the list of exports. If it already exists, that's an error. |
30 // is frozen, that's an error. | |
31 void AddLocalExport(const AstRawString* export_name, | 30 void AddLocalExport(const AstRawString* export_name, |
32 const AstRawString* local_name, Zone* zone, bool* ok); | 31 const AstRawString* local_name, Zone* zone, bool* ok); |
33 | 32 |
34 // Add module_specifier to the list of requested modules, | 33 // Add module_specifier to the list of requested modules, |
35 // if not already present. | 34 // if not already present. |
36 void AddModuleRequest(const AstRawString* module_specifier, Zone* zone); | 35 void AddModuleRequest(const AstRawString* module_specifier, Zone* zone); |
37 | 36 |
38 // Do not allow any further refinements, directly or through unification. | |
39 void Freeze() { frozen_ = true; } | |
40 | |
41 // Assign an index. | 37 // Assign an index. |
42 void Allocate(int index) { | 38 void Allocate(int index) { |
43 DCHECK(IsFrozen() && index_ == -1); | 39 DCHECK_EQ(-1, index_); |
44 index_ = index; | 40 index_ = index; |
45 } | 41 } |
46 | 42 |
47 // --------------------------------------------------------------------------- | 43 // --------------------------------------------------------------------------- |
48 // Accessors. | 44 // Accessors. |
49 | 45 |
50 // Check whether this is closed (i.e. fully determined). | |
51 bool IsFrozen() { return frozen_; } | |
52 | |
53 int Length() { | 46 int Length() { |
54 DCHECK(IsFrozen()); | |
55 ZoneHashMap* exports = exports_; | 47 ZoneHashMap* exports = exports_; |
56 return exports ? exports->occupancy() : 0; | 48 return exports ? exports->occupancy() : 0; |
57 } | 49 } |
58 | 50 |
59 // The context slot in the hosting script context pointing to this module. | 51 // The context slot in the hosting script context pointing to this module. |
60 int Index() { | 52 int Index() { |
61 DCHECK(IsFrozen()); | |
62 return index_; | 53 return index_; |
63 } | 54 } |
64 | 55 |
65 const AstRawString* LookupLocalExport(const AstRawString* export_name, | 56 const AstRawString* LookupLocalExport(const AstRawString* export_name, |
66 Zone* zone); | 57 Zone* zone); |
67 | 58 |
68 const ZoneList<const AstRawString*>& requested_modules() const { | 59 const ZoneList<const AstRawString*>& requested_modules() const { |
69 return requested_modules_; | 60 return requested_modules_; |
70 } | 61 } |
71 | 62 |
(...skipping 25 matching lines...) Expand all Loading... |
97 const ZoneHashMap* exports_; | 88 const ZoneHashMap* exports_; |
98 ZoneHashMap::Entry* entry_; | 89 ZoneHashMap::Entry* entry_; |
99 }; | 90 }; |
100 | 91 |
101 Iterator iterator() const { return Iterator(this->exports_); } | 92 Iterator iterator() const { return Iterator(this->exports_); } |
102 | 93 |
103 // --------------------------------------------------------------------------- | 94 // --------------------------------------------------------------------------- |
104 // Implementation. | 95 // Implementation. |
105 private: | 96 private: |
106 explicit ModuleDescriptor(Zone* zone) | 97 explicit ModuleDescriptor(Zone* zone) |
107 : frozen_(false), | 98 : exports_(NULL), requested_modules_(1, zone), index_(-1) {} |
108 exports_(NULL), | |
109 requested_modules_(1, zone), | |
110 index_(-1) {} | |
111 | 99 |
112 bool frozen_; | |
113 ZoneHashMap* exports_; // Module exports and their types (allocated lazily) | 100 ZoneHashMap* exports_; // Module exports and their types (allocated lazily) |
114 ZoneList<const AstRawString*> requested_modules_; | 101 ZoneList<const AstRawString*> requested_modules_; |
115 int index_; | 102 int index_; |
116 }; | 103 }; |
117 | 104 |
118 } // namespace internal | 105 } // namespace internal |
119 } // namespace v8 | 106 } // namespace v8 |
120 | 107 |
121 #endif // V8_AST_MODULES_H_ | 108 #endif // V8_AST_MODULES_H_ |
OLD | NEW |