2008-01-05 Henry Mason <hmason@mac.com>
authormrowe@apple.com <mrowe@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 5 Jan 2008 08:26:08 +0000 (08:26 +0000)
committermrowe@apple.com <mrowe@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 5 Jan 2008 08:26:08 +0000 (08:26 +0000)
        Reviewed by Maciej Stachowiak.

        http://bugs.webkit.org/show_bug.cgi?id=16738
        Bug 16738: Collector block offset could be stored as an cell offset instead of a byte offset

        Gives a 0.4% SunSpider boost and prettier code.

        * kjs/collector.cpp: Switched to cell offsets from byte offsets
        (KJS::Collector::heapAllocate):
        (KJS::Collector::sweep):

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

JavaScriptCore/ChangeLog
JavaScriptCore/kjs/collector.cpp

index 0e92ba6e7b1027080b6bf4709760615f088056a9..ff4219f6c1a67be46bfaf76bcfde6df496c8b316 100644 (file)
@@ -1,3 +1,16 @@
+2008-01-05  Henry Mason  <hmason@mac.com>
+
+        Reviewed by Maciej Stachowiak.
+
+        http://bugs.webkit.org/show_bug.cgi?id=16738
+        Bug 16738: Collector block offset could be stored as an cell offset instead of a byte offset
+
+        Gives a 0.4% SunSpider boost and prettier code.
+
+        * kjs/collector.cpp: Switched to cell offsets from byte offsets
+        (KJS::Collector::heapAllocate):
+        (KJS::Collector::sweep):
+
 2008-01-04  Mark Rowe  <mrowe@apple.com>
 
         Reviewed by Maciej Stachowiak.
 2008-01-04  Mark Rowe  <mrowe@apple.com>
 
         Reviewed by Maciej Stachowiak.
index 01d7f23d2dc1197bc243cb603bc746452a58ecd7..15840760b5debc2a6d998389ea5712a6af30d515 100644 (file)
@@ -287,9 +287,8 @@ collect:
   // find a free spot in the block and detach it from the free list
   Cell *newCell = targetBlock->freeList;
   
   // find a free spot in the block and detach it from the free list
   Cell *newCell = targetBlock->freeList;
   
-  // "next" field is a byte offset -- 0 means next cell, so a zeroed block is already initialized
-  // could avoid the casts by using a cell offset, but this avoids a relatively-slow multiply
-  targetBlock->freeList = reinterpret_cast<Cell*>(reinterpret_cast<char*>(newCell + 1) + newCell->u.freeCell.next);
+  // "next" field is a cell offset -- 0 means next cell, so a zeroed block is already initialized
+  targetBlock->freeList = (newCell + 1) + newCell->u.freeCell.next;
 
   targetBlock->usedCells = static_cast<uint32_t>(targetBlockUsedCells + 1);
   heap.numLiveObjects = numLiveObjects + 1;
 
   targetBlock->usedCells = static_cast<uint32_t>(targetBlockUsedCells + 1);
   heap.numLiveObjects = numLiveObjects + 1;
@@ -853,7 +852,7 @@ template <Collector::HeapType heapType> size_t Collector::sweep(bool currentThre
                     
                     // put cell on the free list
                     cell->u.freeCell.zeroIfFree = 0;
                     
                     // put cell on the free list
                     cell->u.freeCell.zeroIfFree = 0;
-                    cell->u.freeCell.next = reinterpret_cast<char*>(freeList) - reinterpret_cast<char*>(cell + 1);
+                    cell->u.freeCell.next = freeList - (cell + 1);
                     freeList = cell;
                 }
             }
                     freeList = cell;
                 }
             }
@@ -879,7 +878,7 @@ template <Collector::HeapType heapType> size_t Collector::sweep(bool currentThre
                         
                         // put cell on the free list
                         cell->u.freeCell.zeroIfFree = 0;
                         
                         // put cell on the free list
                         cell->u.freeCell.zeroIfFree = 0;
-                        cell->u.freeCell.next = reinterpret_cast<char*>(freeList) - reinterpret_cast<char*>(cell + 1);
+                        cell->u.freeCell.next = freeList - (cell + 1); 
                         freeList = cell;
                     }
                 }
                         freeList = cell;
                     }
                 }