UnlinkedMetadataTableInlines.h [plain text]
#pragma once
#include "MetadataTable.h"
#include "UnlinkedMetadataTable.h"
#include <wtf/FastMalloc.h>
namespace JSC {
ALWAYS_INLINE UnlinkedMetadataTable::UnlinkedMetadataTable()
: m_hasMetadata(false)
, m_isFinalized(false)
, m_isLinked(false)
, m_is32Bit(false)
, m_rawBuffer(static_cast<uint8_t*>(MetadataTableMalloc::zeroedMalloc(sizeof(LinkingData) + s_offset32TableSize)))
{
}
ALWAYS_INLINE UnlinkedMetadataTable::UnlinkedMetadataTable(bool is32Bit)
: m_hasMetadata(false)
, m_isFinalized(false)
, m_isLinked(false)
, m_is32Bit(is32Bit)
, m_rawBuffer(static_cast<uint8_t*>(MetadataTableMalloc::zeroedMalloc(sizeof(LinkingData) + (is32Bit ? s_offset16TableSize + s_offset32TableSize : s_offset16TableSize))))
{
}
ALWAYS_INLINE UnlinkedMetadataTable::UnlinkedMetadataTable(EmptyTag)
: m_hasMetadata(false)
, m_isFinalized(true)
, m_isLinked(false)
, m_is32Bit(false)
, m_rawBuffer(nullptr)
{
}
ALWAYS_INLINE UnlinkedMetadataTable::~UnlinkedMetadataTable()
{
ASSERT(!m_isLinked);
if (m_hasMetadata || !m_isFinalized)
MetadataTableMalloc::free(m_rawBuffer);
}
ALWAYS_INLINE unsigned UnlinkedMetadataTable::addEntry(OpcodeID opcodeID)
{
ASSERT(!m_isFinalized && opcodeID < s_offsetTableEntries - 1);
m_hasMetadata = true;
return preprocessBuffer()[opcodeID]++;
}
ALWAYS_INLINE size_t UnlinkedMetadataTable::sizeInBytes()
{
if (m_isFinalized && !m_hasMetadata)
return 0;
if (m_is32Bit)
return s_offset16TableSize + s_offset32TableSize;
return s_offset16TableSize;
}
ALWAYS_INLINE size_t UnlinkedMetadataTable::sizeInBytes(MetadataTable& metadataTable)
{
ASSERT(m_isFinalized);
size_t result = metadataTable.totalSize();
if (metadataTable.buffer() == buffer()) {
ASSERT(m_isLinked);
if (m_is32Bit)
return result - (s_offset16TableSize + s_offset32TableSize);
return result - s_offset16TableSize;
}
return result;
}
ALWAYS_INLINE RefPtr<MetadataTable> UnlinkedMetadataTable::link()
{
ASSERT(m_isFinalized);
if (!m_hasMetadata)
return nullptr;
unsigned totalSize = this->totalSize();
unsigned offsetTableSize = this->offsetTableSize();
uint8_t* buffer;
if (!m_isLinked) {
m_isLinked = true;
m_rawBuffer = buffer = reinterpret_cast<uint8_t*>(MetadataTableMalloc::realloc(m_rawBuffer, sizeof(LinkingData) + totalSize));
} else {
buffer = reinterpret_cast<uint8_t*>(MetadataTableMalloc::malloc(sizeof(LinkingData) + totalSize));
memcpy(buffer, m_rawBuffer, sizeof(LinkingData) + offsetTableSize);
}
memset(buffer + sizeof(LinkingData) + offsetTableSize, 0, totalSize - offsetTableSize);
return adoptRef(*new (buffer + sizeof(LinkingData)) MetadataTable(*this));
}
ALWAYS_INLINE void UnlinkedMetadataTable::unlink(MetadataTable& metadataTable)
{
ASSERT(m_isFinalized);
if (!m_hasMetadata)
return;
if (metadataTable.buffer() == buffer()) {
ASSERT(m_isLinked);
m_isLinked = false;
m_rawBuffer = static_cast<uint8_t*>(MetadataTableMalloc::realloc(m_rawBuffer, sizeof(LinkingData) + offsetTableSize()));
return;
}
MetadataTableMalloc::free(&metadataTable.linkingData());
}
}