Diff
Modified: trunk/Source/_javascript_Core/ChangeLog (119452 => 119453)
--- trunk/Source/_javascript_Core/ChangeLog 2012-06-05 03:01:18 UTC (rev 119452)
+++ trunk/Source/_javascript_Core/ChangeLog 2012-06-05 03:17:15 UTC (rev 119453)
@@ -1,3 +1,34 @@
+2012-06-04 Geoffrey Garen <[email protected]>
+
+ Unreviewed.
+
+ Rolled out r119364 because it's still causing crashes (when running
+ v8-earley in release builds of DRT)
+
+ This time for sure!
+
+ * heap/Heap.cpp:
+ (JSC::Heap::collect):
+ * heap/MarkedBlock.cpp:
+ (JSC::MarkedBlock::sweep):
+ * heap/MarkedBlock.h:
+ (JSC::MarkedBlock::resetAllocator):
+ (JSC):
+ * heap/MarkedSpace.cpp:
+ (JSC::ResetAllocator::operator()):
+ (JSC):
+ (JSC::MarkedSpace::resetAllocators):
+ (JSC::MarkedSpace::sweepWeakSets):
+ * heap/MarkedSpace.h:
+ (MarkedSpace):
+ * heap/WeakBlock.cpp:
+ (JSC::WeakBlock::sweep):
+ * heap/WeakSet.cpp:
+ (JSC::WeakSet::sweep):
+ (JSC::WeakSet::tryFindAllocator):
+ * heap/WeakSet.h:
+ (JSC::WeakSet::shrink):
+
2012-06-04 Filip Pizlo <[email protected]>
DFG arguments simplification should have rationalized handling of TearOffArguments
Modified: trunk/Source/_javascript_Core/heap/Heap.cpp (119452 => 119453)
--- trunk/Source/_javascript_Core/heap/Heap.cpp 2012-06-05 03:01:18 UTC (rev 119452)
+++ trunk/Source/_javascript_Core/heap/Heap.cpp 2012-06-05 03:17:15 UTC (rev 119453)
@@ -688,7 +688,8 @@
}
{
- GCPHASE(FinalizeSmallString);
+ GCPHASE(FinalizeWeakHandles);
+ m_objectSpace.sweepWeakSets();
m_globalData->smallStrings.finalizeSmallStrings();
}
Modified: trunk/Source/_javascript_Core/heap/MarkedBlock.cpp (119452 => 119453)
--- trunk/Source/_javascript_Core/heap/MarkedBlock.cpp 2012-06-05 03:01:18 UTC (rev 119452)
+++ trunk/Source/_javascript_Core/heap/MarkedBlock.cpp 2012-06-05 03:17:15 UTC (rev 119453)
@@ -114,8 +114,6 @@
{
HEAP_LOG_BLOCK_STATE_TRANSITION(this);
- m_weakSet.sweep();
-
if (sweepMode == SweepOnly && !m_cellsNeedDestruction)
return FreeList();
Modified: trunk/Source/_javascript_Core/heap/MarkedBlock.h (119452 => 119453)
--- trunk/Source/_javascript_Core/heap/MarkedBlock.h 2012-06-05 03:01:18 UTC (rev 119452)
+++ trunk/Source/_javascript_Core/heap/MarkedBlock.h 2012-06-05 03:17:15 UTC (rev 119453)
@@ -129,6 +129,7 @@
FreeList sweep(SweepMode = SweepOnly);
void shrink();
+ void resetAllocator();
void visitWeakSet(HeapRootVisitor&);
void reapWeakSet();
@@ -273,6 +274,11 @@
m_weakSet.shrink();
}
+ inline void MarkedBlock::resetAllocator()
+ {
+ m_weakSet.resetAllocator();
+ }
+
inline void MarkedBlock::visitWeakSet(HeapRootVisitor& heapRootVisitor)
{
m_weakSet.visit(heapRootVisitor);
Modified: trunk/Source/_javascript_Core/heap/MarkedSpace.cpp (119452 => 119453)
--- trunk/Source/_javascript_Core/heap/MarkedSpace.cpp 2012-06-05 03:01:18 UTC (rev 119452)
+++ trunk/Source/_javascript_Core/heap/MarkedSpace.cpp 2012-06-05 03:17:15 UTC (rev 119453)
@@ -112,6 +112,10 @@
forEachBlock<LastChanceToFinalize>();
}
+struct ResetAllocator : MarkedBlock::VoidFunctor {
+ void operator()(MarkedBlock* block) { block->resetAllocator(); }
+};
+
void MarkedSpace::resetAllocators()
{
for (size_t cellSize = preciseStep; cellSize <= preciseCutoff; cellSize += preciseStep) {
@@ -123,6 +127,8 @@
allocatorFor(cellSize).reset();
destructorAllocatorFor(cellSize).reset();
}
+
+ forEachBlock<ResetAllocator>();
}
void MarkedSpace::visitWeakSets(HeapRootVisitor& heapRootVisitor)
@@ -136,6 +142,11 @@
forEachBlock<ReapWeakSet>();
}
+void MarkedSpace::sweepWeakSets()
+{
+ forEachBlock<SweepWeakSet>();
+}
+
void MarkedSpace::canonicalizeCellLivenessData()
{
for (size_t cellSize = preciseStep; cellSize <= preciseCutoff; cellSize += preciseStep) {
Modified: trunk/Source/_javascript_Core/heap/MarkedSpace.h (119452 => 119453)
--- trunk/Source/_javascript_Core/heap/MarkedSpace.h 2012-06-05 03:01:18 UTC (rev 119452)
+++ trunk/Source/_javascript_Core/heap/MarkedSpace.h 2012-06-05 03:17:15 UTC (rev 119453)
@@ -85,6 +85,7 @@
void visitWeakSets(HeapRootVisitor&);
void reapWeakSets();
+ void sweepWeakSets();
MarkedBlockSet& blocks() { return m_blocks; }
Modified: trunk/Source/_javascript_Core/heap/WeakBlock.cpp (119452 => 119453)
--- trunk/Source/_javascript_Core/heap/WeakBlock.cpp 2012-06-05 03:01:18 UTC (rev 119452)
+++ trunk/Source/_javascript_Core/heap/WeakBlock.cpp 2012-06-05 03:17:15 UTC (rev 119453)
@@ -69,8 +69,7 @@
void WeakBlock::sweep()
{
- // If a block is completely empty, a sweep won't have any effect.
- if (isEmpty())
+ if (!m_sweepResult.isNull())
return;
SweepResult sweepResult;
Modified: trunk/Source/_javascript_Core/heap/WeakSet.cpp (119452 => 119453)
--- trunk/Source/_javascript_Core/heap/WeakSet.cpp 2012-06-05 03:01:18 UTC (rev 119452)
+++ trunk/Source/_javascript_Core/heap/WeakSet.cpp 2012-06-05 03:17:15 UTC (rev 119453)
@@ -42,10 +42,17 @@
void WeakSet::sweep()
{
- for (WeakBlock* block = m_blocks.head(); block; block = block->next())
+ WeakBlock* next;
+ for (WeakBlock* block = m_blocks.head(); block; block = next) {
+ next = block->next();
+
+ // If a block is completely empty, a new sweep won't have any effect.
+ if (block->isEmpty())
+ continue;
+
+ block->takeSweepResult(); // Force a new sweep by discarding the last sweep.
block->sweep();
-
- resetAllocator();
+ }
}
WeakBlock::FreeCell* WeakSet::findAllocator()
@@ -62,6 +69,7 @@
WeakBlock* block = m_nextAllocator;
m_nextAllocator = m_nextAllocator->next();
+ block->sweep();
WeakBlock::SweepResult sweepResult = block->takeSweepResult();
if (sweepResult.freeList)
return sweepResult.freeList;
Modified: trunk/Source/_javascript_Core/heap/WeakSet.h (119452 => 119453)
--- trunk/Source/_javascript_Core/heap/WeakSet.h 2012-06-05 03:01:18 UTC (rev 119452)
+++ trunk/Source/_javascript_Core/heap/WeakSet.h 2012-06-05 03:17:15 UTC (rev 119453)
@@ -118,8 +118,6 @@
if (block->isEmpty())
removeAllocator(block);
}
-
- resetAllocator();
}
inline void WeakSet::resetAllocator()