JSModuleEnvironment.h [plain text]
#pragma once
#include "JSLexicalEnvironment.h"
namespace JSC {
class AbstractModuleRecord;
class Register;
class JSModuleEnvironment : public JSLexicalEnvironment {
friend class JIT;
friend class LLIntOffsetsExtractor;
public:
typedef JSLexicalEnvironment Base;
static const unsigned StructureFlags = Base::StructureFlags | OverridesGetOwnPropertySlot | OverridesGetPropertyNames;
static JSModuleEnvironment* create(VM&, Structure*, JSScope*, SymbolTable*, JSValue initialValue, AbstractModuleRecord*);
static JSModuleEnvironment* create(VM& vm, JSGlobalObject* globalObject, JSScope* currentScope, SymbolTable* symbolTable, JSValue initialValue, AbstractModuleRecord* moduleRecord)
{
Structure* structure = globalObject->moduleEnvironmentStructure();
return create(vm, structure, currentScope, symbolTable, initialValue, moduleRecord);
}
DECLARE_INFO;
static Structure* createStructure(VM& vm, JSGlobalObject* globalObject)
{
return Structure::create(vm, globalObject, jsNull(), TypeInfo(ModuleEnvironmentType, StructureFlags), info());
}
static size_t offsetOfModuleRecord(SymbolTable* symbolTable)
{
size_t offset = Base::allocationSize(symbolTable);
ASSERT(WTF::roundUpToMultipleOf<sizeof(WriteBarrier<AbstractModuleRecord>)>(offset) == offset);
return offset;
}
static size_t allocationSize(SymbolTable* symbolTable)
{
return offsetOfModuleRecord(symbolTable) + sizeof(WriteBarrier<AbstractModuleRecord>);
}
AbstractModuleRecord* moduleRecord()
{
return moduleRecordSlot().get();
}
static bool getOwnPropertySlot(JSObject*, ExecState*, PropertyName, PropertySlot&);
static void getOwnNonIndexPropertyNames(JSObject*, ExecState*, PropertyNameArray&, EnumerationMode);
static bool put(JSCell*, ExecState*, PropertyName, JSValue, PutPropertySlot&);
static bool deleteProperty(JSCell*, ExecState*, PropertyName);
private:
JSModuleEnvironment(VM&, Structure*, JSScope*, SymbolTable*);
void finishCreation(VM&, JSValue initialValue, AbstractModuleRecord*);
WriteBarrierBase<AbstractModuleRecord>& moduleRecordSlot()
{
return *bitwise_cast<WriteBarrierBase<AbstractModuleRecord>*>(bitwise_cast<char*>(this) + offsetOfModuleRecord(symbolTable()));
}
static void visitChildren(JSCell*, SlotVisitor&);
};
inline JSModuleEnvironment::JSModuleEnvironment(VM& vm, Structure* structure, JSScope* currentScope, SymbolTable* symbolTable)
: Base(vm, structure, currentScope, symbolTable)
{
}
}