• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2017 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_OBJECTS_MODULE_INFO_H_
6 #define V8_OBJECTS_MODULE_INFO_H_
7 
8 #include "src/objects.h"
9 
10 // Has to be the last include (doesn't have include guards):
11 #include "src/objects/object-macros.h"
12 
13 namespace v8 {
14 namespace internal {
15 
16 template <typename T>
17 class Handle;
18 class Isolate;
19 class ModuleDescriptor;
20 class ModuleInfoEntry;
21 class String;
22 class Zone;
23 
24 // ModuleInfo is to ModuleDescriptor what ScopeInfo is to Scope.
25 class ModuleInfo : public FixedArray {
26  public:
27   DECLARE_CAST(ModuleInfo)
28 
29   static Handle<ModuleInfo> New(Isolate* isolate, Zone* zone,
30                                 ModuleDescriptor* descr);
31 
module_requests()32   inline FixedArray* module_requests() const {
33     return FixedArray::cast(get(kModuleRequestsIndex));
34   }
35 
special_exports()36   inline FixedArray* special_exports() const {
37     return FixedArray::cast(get(kSpecialExportsIndex));
38   }
39 
regular_exports()40   inline FixedArray* regular_exports() const {
41     return FixedArray::cast(get(kRegularExportsIndex));
42   }
43 
regular_imports()44   inline FixedArray* regular_imports() const {
45     return FixedArray::cast(get(kRegularImportsIndex));
46   }
47 
namespace_imports()48   inline FixedArray* namespace_imports() const {
49     return FixedArray::cast(get(kNamespaceImportsIndex));
50   }
51 
52   // Accessors for [regular_exports].
53   int RegularExportCount() const;
54   String* RegularExportLocalName(int i) const;
55   int RegularExportCellIndex(int i) const;
56   FixedArray* RegularExportExportNames(int i) const;
57 
58   static Handle<ModuleInfoEntry> LookupRegularImport(Handle<ModuleInfo> info,
59                                                      Handle<String> local_name);
60 
61 #ifdef DEBUG
Equals(ModuleInfo * other)62   inline bool Equals(ModuleInfo* other) const {
63     return regular_exports() == other->regular_exports() &&
64            regular_imports() == other->regular_imports() &&
65            special_exports() == other->special_exports() &&
66            namespace_imports() == other->namespace_imports();
67   }
68 #endif
69 
70  private:
71   friend class Factory;
72   friend class ModuleDescriptor;
73   enum {
74     kModuleRequestsIndex,
75     kSpecialExportsIndex,
76     kRegularExportsIndex,
77     kNamespaceImportsIndex,
78     kRegularImportsIndex,
79     kLength
80   };
81   enum {
82     kRegularExportLocalNameOffset,
83     kRegularExportCellIndexOffset,
84     kRegularExportExportNamesOffset,
85     kRegularExportLength
86   };
87   DISALLOW_IMPLICIT_CONSTRUCTORS(ModuleInfo);
88 };
89 
90 class ModuleInfoEntry : public Struct {
91  public:
92   DECLARE_CAST(ModuleInfoEntry)
93   DECLARE_PRINTER(ModuleInfoEntry)
94   DECLARE_VERIFIER(ModuleInfoEntry)
95 
96   DECL_ACCESSORS(export_name, Object)
97   DECL_ACCESSORS(local_name, Object)
98   DECL_ACCESSORS(import_name, Object)
99   DECL_INT_ACCESSORS(module_request)
100   DECL_INT_ACCESSORS(cell_index)
101   DECL_INT_ACCESSORS(beg_pos)
102   DECL_INT_ACCESSORS(end_pos)
103 
104   static Handle<ModuleInfoEntry> New(Isolate* isolate,
105                                      Handle<Object> export_name,
106                                      Handle<Object> local_name,
107                                      Handle<Object> import_name,
108                                      int module_request, int cell_index,
109                                      int beg_pos, int end_pos);
110 
111   static const int kExportNameOffset = HeapObject::kHeaderSize;
112   static const int kLocalNameOffset = kExportNameOffset + kPointerSize;
113   static const int kImportNameOffset = kLocalNameOffset + kPointerSize;
114   static const int kModuleRequestOffset = kImportNameOffset + kPointerSize;
115   static const int kCellIndexOffset = kModuleRequestOffset + kPointerSize;
116   static const int kBegPosOffset = kCellIndexOffset + kPointerSize;
117   static const int kEndPosOffset = kBegPosOffset + kPointerSize;
118   static const int kSize = kEndPosOffset + kPointerSize;
119 
120  private:
121   DISALLOW_IMPLICIT_CONSTRUCTORS(ModuleInfoEntry);
122 };
123 
124 }  // namespace internal
125 }  // namespace v8
126 
127 #include "src/objects/object-macros-undef.h"
128 
129 #endif  // V8_OBJECTS_MODULE_INFO_H_
130