DFGCodeOriginPool.cpp [plain text]
#include "config.h"
#include "DFGCodeOriginPool.h"
#if ENABLE(DFG_JIT)
namespace JSC { namespace DFG {
CallSiteIndex CodeOriginPool::addCodeOrigin(CodeOrigin codeOrigin)
{
if (m_codeOrigins.isEmpty()
|| m_codeOrigins.last() != codeOrigin)
m_codeOrigins.append(codeOrigin);
unsigned index = m_codeOrigins.size() - 1;
ASSERT(m_codeOrigins[index] == codeOrigin);
return CallSiteIndex(index);
}
CallSiteIndex CodeOriginPool::addUniqueCallSiteIndex(CodeOrigin codeOrigin)
{
m_codeOrigins.append(codeOrigin);
unsigned index = m_codeOrigins.size() - 1;
ASSERT(m_codeOrigins[index] == codeOrigin);
return CallSiteIndex(index);
}
CallSiteIndex CodeOriginPool::lastCallSite() const
{
RELEASE_ASSERT(m_codeOrigins.size());
return CallSiteIndex(m_codeOrigins.size() - 1);
}
DisposableCallSiteIndex CodeOriginPool::addDisposableCallSiteIndex(CodeOrigin codeOrigin)
{
if (!m_callSiteIndexFreeList.isEmpty()) {
unsigned index = m_callSiteIndexFreeList.takeLast();
m_codeOrigins[index] = codeOrigin;
return DisposableCallSiteIndex(index);
}
m_codeOrigins.append(codeOrigin);
unsigned index = m_codeOrigins.size() - 1;
ASSERT(m_codeOrigins[index] == codeOrigin);
return DisposableCallSiteIndex(index);
}
void CodeOriginPool::removeDisposableCallSiteIndex(DisposableCallSiteIndex callSite)
{
RELEASE_ASSERT(callSite.bits() < m_codeOrigins.size());
m_callSiteIndexFreeList.append(callSite.bits());
m_codeOrigins[callSite.bits()] = CodeOrigin();
}
void CodeOriginPool::shrinkToFit()
{
m_codeOrigins.shrinkToFit();
m_callSiteIndexFreeList.shrinkToFit();
}
} }
#endif // ENABLE(DFG_JIT)