#pragma once
#include <wtf/StdLibExtras.h>
namespace JSC {
class Heap;
class HeapCell;
class LargeAllocation;
class MarkedBlock;
class WeakSet;
class VM;
typedef uint32_t HeapVersion;
class CellContainer {
public:
CellContainer()
: m_encodedPointer(0)
{
}
CellContainer(MarkedBlock& markedBlock)
: m_encodedPointer(bitwise_cast<uintptr_t>(&markedBlock))
{
}
CellContainer(LargeAllocation& largeAllocation)
: m_encodedPointer(bitwise_cast<uintptr_t>(&largeAllocation) | isLargeAllocationBit)
{
}
VM* vm() const;
Heap* heap() const;
explicit operator bool() const { return !!m_encodedPointer; }
bool isMarkedBlock() const { return m_encodedPointer && !(m_encodedPointer & isLargeAllocationBit); }
bool isLargeAllocation() const { return m_encodedPointer & isLargeAllocationBit; }
MarkedBlock& markedBlock() const
{
ASSERT(isMarkedBlock());
return *bitwise_cast<MarkedBlock*>(m_encodedPointer);
}
LargeAllocation& largeAllocation() const
{
ASSERT(isLargeAllocation());
return *bitwise_cast<LargeAllocation*>(m_encodedPointer - isLargeAllocationBit);
}
void aboutToMark(HeapVersion markingVersion);
bool areMarksStale() const;
bool isMarked(HeapCell*) const;
bool isMarked(HeapVersion markingVersion, HeapCell*) const;
bool isNewlyAllocated(HeapCell*) const;
void noteMarked();
void assertValidCell(VM&, HeapCell*) const;
size_t cellSize() const;
WeakSet& weakSet() const;
private:
static const uintptr_t isLargeAllocationBit = 1;
uintptr_t m_encodedPointer;
};
}