#pragma once
#include <wtf/StdLibExtras.h>
namespace JSC {
class Heap;
class HeapCell;
class PreciseAllocation;
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(PreciseAllocation& preciseAllocation)
: m_encodedPointer(bitwise_cast<uintptr_t>(&preciseAllocation) | isPreciseAllocationBit)
{
}
VM& vm() const;
Heap* heap() const;
explicit operator bool() const { return !!m_encodedPointer; }
bool isMarkedBlock() const { return m_encodedPointer && !(m_encodedPointer & isPreciseAllocationBit); }
bool isPreciseAllocation() const { return m_encodedPointer & isPreciseAllocationBit; }
MarkedBlock& markedBlock() const
{
ASSERT(isMarkedBlock());
return *bitwise_cast<MarkedBlock*>(m_encodedPointer);
}
PreciseAllocation& preciseAllocation() const
{
ASSERT(isPreciseAllocation());
return *bitwise_cast<PreciseAllocation*>(m_encodedPointer - isPreciseAllocationBit);
}
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 constexpr uintptr_t isPreciseAllocationBit = 1;
uintptr_t m_encodedPointer;
};
}