#pragma once
#include "AbstractModuleRecord.h"
namespace JSC {
class ModuleProgramExecutable;
class JSModuleRecord : public AbstractModuleRecord {
friend class LLIntOffsetsExtractor;
public:
typedef AbstractModuleRecord Base;
DECLARE_EXPORT_INFO;
JSModuleEnvironment* moduleEnvironment()
{
ASSERT(m_moduleEnvironment);
return m_moduleEnvironment.get();
}
static Structure* createStructure(VM&, JSGlobalObject*, JSValue);
static JSModuleRecord* create(ExecState*, VM&, Structure*, const Identifier&, const SourceCode&, const VariableEnvironment&, const VariableEnvironment&);
void link(ExecState*);
JS_EXPORT_PRIVATE JSValue evaluate(ExecState*);
const SourceCode& sourceCode() const { return m_sourceCode; }
const VariableEnvironment& declaredVariables() const { return m_declaredVariables; }
const VariableEnvironment& lexicalVariables() const { return m_lexicalVariables; }
ModuleProgramExecutable* moduleProgramExecutable() const { return m_moduleProgramExecutable.get(); }
private:
JSModuleRecord(VM&, Structure*, const Identifier&, const SourceCode&, const VariableEnvironment&, const VariableEnvironment&);
void finishCreation(ExecState*, VM&);
static void visitChildren(JSCell*, SlotVisitor&);
static void destroy(JSCell*);
void instantiateDeclarations(ExecState*, ModuleProgramExecutable*);
SourceCode m_sourceCode;
VariableEnvironment m_declaredVariables;
VariableEnvironment m_lexicalVariables;
WriteBarrier<ModuleProgramExecutable> m_moduleProgramExecutable;
};
}