Add finalizer to JSObject
authormhahnenberg@apple.com <mhahnenberg@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 21 Oct 2011 19:36:46 +0000 (19:36 +0000)
committermhahnenberg@apple.com <mhahnenberg@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 21 Oct 2011 19:36:46 +0000 (19:36 +0000)
https://bugs.webkit.org/show_bug.cgi?id=70336

Reviewed by Darin Adler.

* heap/MarkedBlock.cpp:
(JSC::MarkedBlock::callDestructor): Skip the call to the destructor
if we're a JSFinalObject, since the finalizer takes care of things.
* runtime/JSCell.h:
(JSC::JSCell::~JSCell): Remove the GC validation due to a conflict with
future changes and the fact that we no longer always call the destructor, making
the information provided less useful.
* runtime/JSObject.cpp:
(JSC::JSObject::finalize): Add finalizer for JSObject.
(JSC::JSObject::allocatePropertyStorage): The first time we need to allocate out-of-line
property storage, we add a finalizer to ourself.
* runtime/JSObject.h:

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

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

index 4f45d40..151c63a 100644 (file)
@@ -1,3 +1,23 @@
+2011-10-21  Mark Hahnenberg  <mhahnenberg@apple.com>
+
+        Add finalizer to JSObject
+        https://bugs.webkit.org/show_bug.cgi?id=70336
+
+        Reviewed by Darin Adler.
+
+        * heap/MarkedBlock.cpp:
+        (JSC::MarkedBlock::callDestructor): Skip the call to the destructor 
+        if we're a JSFinalObject, since the finalizer takes care of things.
+        * runtime/JSCell.h:
+        (JSC::JSCell::~JSCell): Remove the GC validation due to a conflict with 
+        future changes and the fact that we no longer always call the destructor, making 
+        the information provided less useful.
+        * runtime/JSObject.cpp:
+        (JSC::JSObject::finalize): Add finalizer for JSObject.
+        (JSC::JSObject::allocatePropertyStorage): The first time we need to allocate out-of-line
+        property storage, we add a finalizer to ourself.
+        * runtime/JSObject.h:
+
 2011-10-21  Simon Hausmann  <simon.hausmann@nokia.com>
 
         Remove QtScript source code from WebKit.
 2011-10-21  Simon Hausmann  <simon.hausmann@nokia.com>
 
         Remove QtScript source code from WebKit.
index 6496ab5..58dc457 100644 (file)
@@ -70,9 +70,7 @@ inline void MarkedBlock::callDestructor(JSCell* cell, void* jsFinalObjectVPtr)
 #if ENABLE(SIMPLE_HEAP_PROFILING)
     m_heap->m_destroyedTypeCounts.countVPtr(vptr);
 #endif
 #if ENABLE(SIMPLE_HEAP_PROFILING)
     m_heap->m_destroyedTypeCounts.countVPtr(vptr);
 #endif
-    if (vptr == jsFinalObjectVPtr)
-        reinterpret_cast<JSFinalObject*>(cell)->JSFinalObject::~JSFinalObject();
-    else
+    if (vptr != jsFinalObjectVPtr)
         cell->~JSCell();
 
     cell->zap();
         cell->~JSCell();
 
     cell->zap();
index b85b6c0..4ff1a58 100644 (file)
@@ -177,9 +177,6 @@ namespace JSC {
 
     inline JSCell::~JSCell()
     {
 
     inline JSCell::~JSCell()
     {
-#if ENABLE(GC_VALIDATION)
-        m_structure.clear();
-#endif
     }
 
     inline Structure* JSCell::structure() const
     }
 
     inline Structure* JSCell::structure() const
index 622f771..728d9af 100644 (file)
@@ -70,6 +70,11 @@ static inline void getClassPropertyNames(ExecState* exec, const ClassInfo* class
     }
 }
 
     }
 }
 
+void JSObject::finalize(JSCell* cell)
+{
+    delete [] static_cast<JSObject*>(cell)->m_propertyStorage.get();
+}
+
 void JSObject::visitChildren(JSCell* cell, SlotVisitor& visitor)
 {
     JSObject* thisObject = static_cast<JSObject*>(cell);
 void JSObject::visitChildren(JSCell* cell, SlotVisitor& visitor)
 {
     JSObject* thisObject = static_cast<JSObject*>(cell);
@@ -688,7 +693,9 @@ void JSObject::allocatePropertyStorage(JSGlobalData& globalData, size_t oldSize,
     for (unsigned i = 0; i < oldSize; ++i)
        newPropertyStorage[i] = oldPropertyStorage[i];
 
     for (unsigned i = 0; i < oldSize; ++i)
        newPropertyStorage[i] = oldPropertyStorage[i];
 
-    if (!isUsingInlineStorage())
+    if (isUsingInlineStorage())
+        Heap::heap(this)->addFinalizer(this, &finalize);
+    else
         delete [] oldPropertyStorage;
 
     m_propertyStorage.set(globalData, this, newPropertyStorage);
         delete [] oldPropertyStorage;
 
     m_propertyStorage.set(globalData, this, newPropertyStorage);
index dc9061a..3458fab 100644 (file)
@@ -84,9 +84,7 @@ namespace JSC {
 
         virtual UString className() const;
 
 
         virtual UString className() const;
 
-        // The inline virtual destructor cannot be the first virtual function declared
-        // in the class as it results in the vtable being generated as a weak symbol
-        virtual ~JSObject();
+        static void finalize(JSCell*);
 
         JSValue prototype() const;
         void setPrototype(JSGlobalData&, JSValue prototype);
 
         JSValue prototype() const;
         void setPrototype(JSGlobalData&, JSValue prototype);
@@ -446,12 +444,6 @@ inline JSObject::JSObject(JSGlobalData& globalData, Structure* structure, Proper
 {
 }
 
 {
 }
 
-inline JSObject::~JSObject()
-{
-    if (!isUsingInlineStorage())
-        delete [] m_propertyStorage.get();
-}
-
 inline JSValue JSObject::prototype() const
 {
     return structure()->storedPrototype();
 inline JSValue JSObject::prototype() const
 {
     return structure()->storedPrototype();