#ifndef GeneratorFrame_h
#define GeneratorFrame_h
#include "JSCell.h"
#include <wtf/FastBitVector.h>
namespace JSC {
class GeneratorFrame : public JSCell {
friend class JIT;
#if ENABLE(DFG_JIT)
friend class DFG::SpeculativeJIT;
friend class DFG::JITCompiler;
#endif
friend class VM;
public:
typedef JSCell Base;
static const unsigned StructureFlags = StructureIsImmortal | Base::StructureFlags;
DECLARE_EXPORT_INFO;
static GeneratorFrame* create(VM&, size_t numberOfCalleeLocals);
WriteBarrierBase<Unknown>* locals()
{
return bitwise_cast<WriteBarrierBase<Unknown>*>(bitwise_cast<char*>(this) + offsetOfLocals());
}
WriteBarrierBase<Unknown>& localAt(size_t index)
{
ASSERT(index < m_numberOfCalleeLocals);
return locals()[index];
}
static size_t offsetOfLocals()
{
return WTF::roundUpToMultipleOf<sizeof(WriteBarrier<Unknown>)>(sizeof(GeneratorFrame));
}
static size_t allocationSizeForLocals(unsigned numberOfLocals)
{
return offsetOfLocals() + numberOfLocals * sizeof(WriteBarrier<Unknown>);
}
static Structure* createStructure(VM&, JSGlobalObject*, JSValue prototype);
void save(ExecState*, const FastBitVector& liveCalleeLocals);
void resume(ExecState*, const FastBitVector& liveCalleeLocals);
private:
GeneratorFrame(VM&, size_t numberOfCalleeLocals);
size_t m_numberOfCalleeLocals;
friend class LLIntOffsetsExtractor;
void finishCreation(VM&);
protected:
static void visitChildren(JSCell*, SlotVisitor&);
};
}
#endif // GeneratorFrame_h