#pragma once
#include "AbstractModuleRecord.h"
#include "SourceCode.h"
#include "VariableEnvironment.h"
namespace JSC {
class ModuleProgramExecutable;
class JSModuleRecord final : public AbstractModuleRecord {
friend class LLIntOffsetsExtractor;
public:
using Base = AbstractModuleRecord;
DECLARE_EXPORT_INFO;
static constexpr bool needsDestruction = true;
static void destroy(JSCell*);
template<typename CellType, SubspaceAccess mode>
static IsoSubspace* subspaceFor(VM& vm)
{
return vm.jsModuleRecordSpace<mode>();
}
static Structure* createStructure(VM&, JSGlobalObject*, JSValue);
static JSModuleRecord* create(JSGlobalObject*, VM&, Structure*, const Identifier&, const SourceCode&, const VariableEnvironment&, const VariableEnvironment&);
void link(JSGlobalObject*, JSValue scriptFetcher);
JS_EXPORT_PRIVATE JSValue evaluate(JSGlobalObject*);
const SourceCode& sourceCode() const { return m_sourceCode; }
const VariableEnvironment& declaredVariables() const { return m_declaredVariables; }
const VariableEnvironment& lexicalVariables() const { return m_lexicalVariables; }
private:
JSModuleRecord(VM&, Structure*, const Identifier&, const SourceCode&, const VariableEnvironment&, const VariableEnvironment&);
void finishCreation(JSGlobalObject*, VM&);
static void visitChildren(JSCell*, SlotVisitor&);
void instantiateDeclarations(JSGlobalObject*, ModuleProgramExecutable*, JSValue scriptFetcher);
SourceCode m_sourceCode;
VariableEnvironment m_declaredVariables;
VariableEnvironment m_lexicalVariables;
WriteBarrier<ModuleProgramExecutable> m_moduleProgramExecutable;
};
}