summaryrefslogtreecommitdiffstats
path: root/Source/JavaScriptCore/runtime/MarkedBlock.cpp
diff options
context:
space:
mode:
authorBen Murdoch <benm@google.com>2011-05-24 11:24:40 +0100
committerBen Murdoch <benm@google.com>2011-06-02 09:53:15 +0100
commit81bc750723a18f21cd17d1b173cd2a4dda9cea6e (patch)
tree7a9e5ed86ff429fd347a25153107221543909b19 /Source/JavaScriptCore/runtime/MarkedBlock.cpp
parent94088a6d336c1dd80a1e734af51e96abcbb689a7 (diff)
downloadexternal_webkit-81bc750723a18f21cd17d1b173cd2a4dda9cea6e.zip
external_webkit-81bc750723a18f21cd17d1b173cd2a4dda9cea6e.tar.gz
external_webkit-81bc750723a18f21cd17d1b173cd2a4dda9cea6e.tar.bz2
Merge WebKit at r80534: Intial merge by Git
Change-Id: Ia7a83357124c9e1cdb1debf55d9661ec0bd09a61
Diffstat (limited to 'Source/JavaScriptCore/runtime/MarkedBlock.cpp')
-rw-r--r--Source/JavaScriptCore/runtime/MarkedBlock.cpp33
1 files changed, 19 insertions, 14 deletions
diff --git a/Source/JavaScriptCore/runtime/MarkedBlock.cpp b/Source/JavaScriptCore/runtime/MarkedBlock.cpp
index 16053f2..48dda4c 100644
--- a/Source/JavaScriptCore/runtime/MarkedBlock.cpp
+++ b/Source/JavaScriptCore/runtime/MarkedBlock.cpp
@@ -27,33 +27,38 @@
#include "MarkedBlock.h"
#include "JSCell.h"
+#include "ScopeChain.h"
namespace JSC {
-MarkedBlock* MarkedBlock::create(JSGlobalData* globalData)
+MarkedBlock* MarkedBlock::create(JSGlobalData* globalData, size_t cellSize)
{
- PageAllocationAligned allocation = PageAllocationAligned::allocate(BLOCK_SIZE, BLOCK_SIZE, OSAllocator::JSGCHeapPages);
+ PageAllocationAligned allocation = PageAllocationAligned::allocate(blockSize, blockSize, OSAllocator::JSGCHeapPages);
if (!static_cast<bool>(allocation))
CRASH();
- return new (allocation.base()) MarkedBlock(allocation, globalData);
+ return new (allocation.base()) MarkedBlock(allocation, globalData, cellSize);
}
void MarkedBlock::destroy(MarkedBlock* block)
{
- for (size_t i = 0; i < CELLS_PER_BLOCK; ++i)
- reinterpret_cast<JSCell*>(&block->cells[i])->~JSCell();
+ for (size_t i = block->firstAtom(); i < block->m_endAtom; i += block->m_atomsPerCell)
+ reinterpret_cast<JSCell*>(&block->atoms()[i])->~JSCell();
block->m_allocation.deallocate();
}
-MarkedBlock::MarkedBlock(const PageAllocationAligned& allocation, JSGlobalData* globalData)
- : m_allocation(allocation)
+MarkedBlock::MarkedBlock(const PageAllocationAligned& allocation, JSGlobalData* globalData, size_t cellSize)
+ : m_nextAtom(firstAtom())
+ , m_allocation(allocation)
, m_heap(&globalData->heap)
+ , m_prev(0)
+ , m_next(0)
{
- marked.set(CELLS_PER_BLOCK - 1);
+ m_atomsPerCell = (cellSize + atomSize - 1) / atomSize;
+ m_endAtom = atomsPerBlock - m_atomsPerCell + 1;
Structure* dummyMarkableCellStructure = globalData->dummyMarkableCellStructure.get();
- for (size_t i = 0; i < CELLS_PER_BLOCK; ++i)
- new (&cells[i]) JSCell(dummyMarkableCellStructure);
+ for (size_t i = firstAtom(); i < m_endAtom; i += m_atomsPerCell)
+ new (&atoms()[i]) JSCell(dummyMarkableCellStructure);
}
void MarkedBlock::sweep()
@@ -62,17 +67,17 @@ void MarkedBlock::sweep()
Structure* dummyMarkableCellStructure = m_heap->globalData()->dummyMarkableCellStructure.get();
#endif
- for (size_t i = 0; i < CELLS_PER_BLOCK; ++i) {
- if (marked.get(i))
+ for (size_t i = firstAtom(); i < m_endAtom; i += m_atomsPerCell) {
+ if (m_marks.get(i))
continue;
- JSCell* cell = reinterpret_cast<JSCell*>(&cells[i]);
+ JSCell* cell = reinterpret_cast<JSCell*>(&atoms()[i]);
#if ENABLE(JSC_ZOMBIES)
if (!cell->isZombie()) {
const ClassInfo* info = cell->classInfo();
cell->~JSCell();
new (cell) JSZombie(info, JSZombie::leakedZombieStructure());
- marked.set(i);
+ m_marks.set(i);
}
#else
cell->~JSCell();