Templatize GC's destructor invocation for dtor type.
authorakling@apple.com <akling@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 23 May 2014 22:14:20 +0000 (22:14 +0000)
committerakling@apple.com <akling@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 23 May 2014 22:14:20 +0000 (22:14 +0000)
<https://webkit.org/b/133231>

Get rid of a branch in callDestructor() by templatizing it for
the DestructorType. Removed JSCell::methodTableForDestruction()
since this was the only call site and it was jumping through
a bunch of unnecessary hoops.

Reviewed by Geoffrey Garen.

* heap/MarkedBlock.cpp:
(JSC::MarkedBlock::callDestructor):
(JSC::MarkedBlock::specializedSweep):
* heap/MarkedBlock.h:
* runtime/JSCell.h:
* runtime/JSCellInlines.h:
(JSC::JSCell::methodTableForDestruction): Deleted.

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

Source/JavaScriptCore/ChangeLog
Source/JavaScriptCore/heap/MarkedBlock.cpp
Source/JavaScriptCore/heap/MarkedBlock.h
Source/JavaScriptCore/runtime/JSCell.h
Source/JavaScriptCore/runtime/JSCellInlines.h

index 27cea0c..fd1c00b 100644 (file)
@@ -1,5 +1,25 @@
 2014-05-23  Andreas Kling  <akling@apple.com>
 
+        Templatize GC's destructor invocation for dtor type.
+        <https://webkit.org/b/133231>
+
+        Get rid of a branch in callDestructor() by templatizing it for
+        the DestructorType. Removed JSCell::methodTableForDestruction()
+        since this was the only call site and it was jumping through
+        a bunch of unnecessary hoops.
+
+        Reviewed by Geoffrey Garen.
+
+        * heap/MarkedBlock.cpp:
+        (JSC::MarkedBlock::callDestructor):
+        (JSC::MarkedBlock::specializedSweep):
+        * heap/MarkedBlock.h:
+        * runtime/JSCell.h:
+        * runtime/JSCellInlines.h:
+        (JSC::JSCell::methodTableForDestruction): Deleted.
+
+2014-05-23  Andreas Kling  <akling@apple.com>
+
         Support inline caching of RegExpMatchesArray.length
         <https://webkit.org/b/133234>
 
index 104f926..f4d39fc 100644 (file)
@@ -54,13 +54,17 @@ MarkedBlock::MarkedBlock(Region* region, MarkedAllocator* allocator, size_t cell
     HEAP_LOG_BLOCK_STATE_TRANSITION(this);
 }
 
+template<MarkedBlock::DestructorType dtorType>
 inline void MarkedBlock::callDestructor(JSCell* cell)
 {
     // A previous eager sweep may already have run cell's destructor.
     if (cell->isZapped())
         return;
 
-    cell->methodTableForDestruction()->destroy(cell);
+    if (dtorType == MarkedBlock::Normal)
+        jsCast<JSDestructibleObject*>(cell)->classInfo()->methodTable.destroy(cell);
+    else
+        cell->structure(*vm())->classInfo()->methodTable.destroy(cell);
     cell->zap();
 }
 
@@ -82,7 +86,7 @@ MarkedBlock::FreeList MarkedBlock::specializedSweep()
         JSCell* cell = reinterpret_cast_ptr<JSCell*>(&atoms()[i]);
 
         if (dtorType != MarkedBlock::None && blockState != New)
-            callDestructor(cell);
+            callDestructor<dtorType>(cell);
 
         if (sweepMode == SweepToFreeList) {
             FreeCell* freeCell = reinterpret_cast<FreeCell*>(cell);
index 5a1843a..f2626b7 100644 (file)
@@ -197,7 +197,7 @@ namespace JSC {
         MarkedBlock(Region*, MarkedAllocator*, size_t cellSize, DestructorType);
         Atom* atoms();
         size_t atomNumber(const void*);
-        void callDestructor(JSCell*);
+        template<DestructorType> void callDestructor(JSCell*);
         template<BlockState, SweepMode, DestructorType> FreeList specializedSweep();
         
         size_t m_atomsPerCell;
index 101fe8d..997f789 100644 (file)
@@ -132,7 +132,6 @@ public:
     const ClassInfo* classInfo() const;
     const MethodTable* methodTable() const;
     const MethodTable* methodTable(VM&) const;
-    const MethodTable* methodTableForDestruction() const;
     static void put(JSCell*, ExecState*, PropertyName, JSValue, PutPropertySlot&);
     static void putByIndex(JSCell*, ExecState*, unsigned propertyName, JSValue, bool shouldThrow);
         
index 2809469..27bc9ee 100644 (file)
@@ -180,11 +180,6 @@ inline void JSCell::setStructure(VM& vm, Structure* structure)
     m_indexingType = structure->indexingType();
 }
 
-inline const MethodTable* JSCell::methodTableForDestruction() const
-{
-    return &classInfo()->methodTable;
-}
-
 inline const MethodTable* JSCell::methodTable() const
 {
     VM& vm = *Heap::heap(this)->vm();