// Copyright 2017 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_OBJECTS_MODULE_INFO_H_ #define V8_OBJECTS_MODULE_INFO_H_ #include "src/objects.h" // Has to be the last include (doesn't have include guards): #include "src/objects/object-macros.h" namespace v8 { namespace internal { template <typename T> class Handle; class Isolate; class ModuleDescriptor; class ModuleInfoEntry; class String; class Zone; // ModuleInfo is to ModuleDescriptor what ScopeInfo is to Scope. class ModuleInfo : public FixedArray { public: DECLARE_CAST(ModuleInfo) static Handle<ModuleInfo> New(Isolate* isolate, Zone* zone, ModuleDescriptor* descr); inline FixedArray* module_requests() const { return FixedArray::cast(get(kModuleRequestsIndex)); } inline FixedArray* special_exports() const { return FixedArray::cast(get(kSpecialExportsIndex)); } inline FixedArray* regular_exports() const { return FixedArray::cast(get(kRegularExportsIndex)); } inline FixedArray* regular_imports() const { return FixedArray::cast(get(kRegularImportsIndex)); } inline FixedArray* namespace_imports() const { return FixedArray::cast(get(kNamespaceImportsIndex)); } // Accessors for [regular_exports]. int RegularExportCount() const; String* RegularExportLocalName(int i) const; int RegularExportCellIndex(int i) const; FixedArray* RegularExportExportNames(int i) const; static Handle<ModuleInfoEntry> LookupRegularImport(Handle<ModuleInfo> info, Handle<String> local_name); #ifdef DEBUG inline bool Equals(ModuleInfo* other) const { return regular_exports() == other->regular_exports() && regular_imports() == other->regular_imports() && special_exports() == other->special_exports() && namespace_imports() == other->namespace_imports(); } #endif private: friend class Factory; friend class ModuleDescriptor; enum { kModuleRequestsIndex, kSpecialExportsIndex, kRegularExportsIndex, kNamespaceImportsIndex, kRegularImportsIndex, kLength }; enum { kRegularExportLocalNameOffset, kRegularExportCellIndexOffset, kRegularExportExportNamesOffset, kRegularExportLength }; DISALLOW_IMPLICIT_CONSTRUCTORS(ModuleInfo); }; class ModuleInfoEntry : public Struct { public: DECLARE_CAST(ModuleInfoEntry) DECLARE_PRINTER(ModuleInfoEntry) DECLARE_VERIFIER(ModuleInfoEntry) DECL_ACCESSORS(export_name, Object) DECL_ACCESSORS(local_name, Object) DECL_ACCESSORS(import_name, Object) DECL_INT_ACCESSORS(module_request) DECL_INT_ACCESSORS(cell_index) DECL_INT_ACCESSORS(beg_pos) DECL_INT_ACCESSORS(end_pos) static Handle<ModuleInfoEntry> New(Isolate* isolate, Handle<Object> export_name, Handle<Object> local_name, Handle<Object> import_name, int module_request, int cell_index, int beg_pos, int end_pos); static const int kExportNameOffset = HeapObject::kHeaderSize; static const int kLocalNameOffset = kExportNameOffset + kPointerSize; static const int kImportNameOffset = kLocalNameOffset + kPointerSize; static const int kModuleRequestOffset = kImportNameOffset + kPointerSize; static const int kCellIndexOffset = kModuleRequestOffset + kPointerSize; static const int kBegPosOffset = kCellIndexOffset + kPointerSize; static const int kEndPosOffset = kBegPosOffset + kPointerSize; static const int kSize = kEndPosOffset + kPointerSize; private: DISALLOW_IMPLICIT_CONSTRUCTORS(ModuleInfoEntry); }; } // namespace internal } // namespace v8 #include "src/objects/object-macros-undef.h" #endif // V8_OBJECTS_MODULE_INFO_H_