// 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_