#include "config.h"
#include "CopiedBlock.h"
#include "JSCInlines.h"
namespace JSC {
static const bool computeBalance = false;
static size_t balance;
CopiedBlock* CopiedBlock::createNoZeroFill(Heap& heap, size_t capacity)
{
if (computeBalance) {
balance++;
if (!(balance % 10))
dataLog("CopiedBlock Balance: ", balance, "\n");
}
CopiedBlock* block = new (NotNull, fastAlignedMalloc(CopiedBlock::blockSize, capacity)) CopiedBlock(capacity);
heap.didAllocateBlock(capacity);
return block;
}
void CopiedBlock::destroy(Heap& heap, CopiedBlock* copiedBlock)
{
if (computeBalance) {
balance--;
if (!(balance % 10))
dataLog("CopiedBlock Balance: ", balance, "\n");
}
size_t capacity = copiedBlock->capacity();
copiedBlock->~CopiedBlock();
fastAlignedFree(copiedBlock);
heap.didFreeBlock(capacity);
}
CopiedBlock* CopiedBlock::create(Heap& heap, size_t capacity)
{
CopiedBlock* newBlock = createNoZeroFill(heap, capacity);
newBlock->zeroFillWilderness();
return newBlock;
}
void CopiedBlock::zeroFillWilderness()
{
#if USE(JSVALUE64)
memset(wilderness(), 0, wildernessSize());
#else
JSValue emptyValue;
JSValue* limit = reinterpret_cast_ptr<JSValue*>(wildernessEnd());
for (JSValue* currentValue = reinterpret_cast_ptr<JSValue*>(wilderness()); currentValue < limit; currentValue++)
*currentValue = emptyValue;
#endif
}
CopiedBlock::CopiedBlock(size_t capacity)
: DoublyLinkedListNode<CopiedBlock>()
, m_capacity(capacity)
, m_remaining(payloadCapacity())
, m_isPinned(false)
, m_isOld(false)
, m_liveBytes(0)
#ifndef NDEBUG
, m_liveObjects(0)
#endif
{
ASSERT(is8ByteAligned(reinterpret_cast<void*>(m_remaining)));
}
}