2011-02-07 Geoffrey Garen <ggaren@apple.com>
authorggaren@apple.com <ggaren@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 8 Feb 2011 01:58:19 +0000 (01:58 +0000)
committerggaren@apple.com <ggaren@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 8 Feb 2011 01:58:19 +0000 (01:58 +0000)
        Reviewed by Oliver Hunt.

        Simplified the marked space's mark invariant
        https://bugs.webkit.org/show_bug.cgi?id=53968

        SunSpider reports no change.

        * runtime/MarkedSpace.cpp:
        (JSC::MarkedSpace::allocate): Mark objects when allocating them. This
        means that, at all times other than the mark phase, an object is live
        if and only if it is marked.

        (JSC::MarkedSpace::containsSlowCase): Use the new mark invariant to
        simplify testing whether an object is live.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@77877 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/JavaScriptCore/ChangeLog
Source/JavaScriptCore/runtime/MarkedSpace.cpp

index 07278d25107abb69c8565d2ae931dd402d4a0c3c..dd25c6641e2d4e98db6df45f86623ad5564a6a40 100644 (file)
@@ -1,3 +1,20 @@
+2011-02-07  Geoffrey Garen  <ggaren@apple.com>
+
+        Reviewed by Oliver Hunt.
+
+        Simplified the marked space's mark invariant
+        https://bugs.webkit.org/show_bug.cgi?id=53968
+        
+        SunSpider reports no change.
+        
+        * runtime/MarkedSpace.cpp:
+        (JSC::MarkedSpace::allocate): Mark objects when allocating them. This
+        means that, at all times other than the mark phase, an object is live
+        if and only if it is marked.
+
+        (JSC::MarkedSpace::containsSlowCase): Use the new mark invariant to
+        simplify testing whether an object is live.
+
 2011-02-07  Beth Dakin  <bdakin@apple.com>
 
         Reviewed by Eric Seidel.
index b2e2ee5fad5b7210b9231cedd7be3c8836fc0e12..af4b73af5f3fb187695573af4971ce15e19baab0 100644 (file)
@@ -126,7 +126,7 @@ void* MarkedSpace::allocate(size_t s)
         Block* block = m_heap.collectorBlock(m_heap.nextBlock);
         do {
             ASSERT(m_heap.nextCell < HeapConstants::cellsPerBlock);
-            if (!block->marked.get(m_heap.nextCell)) { // Always false for the last cell in the block
+            if (!block->marked.testAndSet(m_heap.nextCell)) { // Always false for the last cell in the block
                 Cell* cell = &block->cells[m_heap.nextCell];
 
                 JSCell* imp = reinterpret_cast<JSCell*>(cell);
@@ -141,8 +141,12 @@ void* MarkedSpace::allocate(size_t s)
         m_heap.waterMark += BLOCK_SIZE;
     } while (++m_heap.nextBlock != m_heap.usedBlocks);
 
-    if (m_heap.waterMark < m_heap.highWaterMark)
-        return &allocateBlock()->cells[m_heap.nextCell++];
+    if (m_heap.waterMark < m_heap.highWaterMark) {
+        MarkedBlock* block = allocateBlock();
+        ASSERT(!block->marked.get(m_heap.nextCell));
+        block->marked.set(m_heap.nextCell);
+        return &block->cells[m_heap.nextCell++];
+    }
 
     return 0;
 }
@@ -208,14 +212,7 @@ bool MarkedSpace::containsSlowCase(const void* x)
         // x is a pointer into the heap. Now, verify that the cell it
         // points to is live. (If the cell is dead, we must not mark it,
         // since that would revive it in a zombie state.)
-        if (block < m_heap.nextBlock)
-            return true;
-        
         size_t cellOffset = offset / CELL_SIZE;
-        
-        if (block == m_heap.nextBlock && cellOffset < m_heap.nextCell)
-            return true;
-        
         return blockAddr->marked.get(cellOffset);
     }