Ignore:
Timestamp:
Apr 12, 2011, 4:27:37 PM (14 years ago)
Author:
[email protected]
Message:

2011-04-12 Oliver Hunt <[email protected]>

Reviewed by Geoffrey Garen.

Make API callback objects use weak handles to run their finalizers
https://bugs.webkit.org/show_bug.cgi?id=58389

Make the API object's private data struct act as a finalizer for
an api object if the callback object has a API defined finalizer.

  • API/JSCallbackObject.cpp: (JSC::JSCallbackObjectData::finalize):
  • API/JSCallbackObject.h:
  • API/JSCallbackObjectFunctions.h: (JSC::::init):
  • heap/Handle.h:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/API/JSCallbackObjectFunctions.h

    r79240 r83661  
    8989        initialize(toRef(exec), toRef(this));
    9090    }
    91 }
    92 
    93 template <class Base>
    94 JSCallbackObject<Base>::~JSCallbackObject()
    95 {
    96     JSObjectRef thisRef = toRef(this);
    97    
    98     for (JSClassRef jsClass = classRef(); jsClass; jsClass = jsClass->parentClass)
    99         if (JSObjectFinalizeCallback finalize = jsClass->finalize)
    100             finalize(thisRef);
     91
     92    bool needsFinalizer = false;
     93    for (JSClassRef jsClassPtr = classRef(); jsClassPtr && !needsFinalizer; jsClassPtr = jsClassPtr->parentClass)
     94        needsFinalizer = jsClassPtr->finalize;
     95    if (needsFinalizer) {
     96        HandleSlot slot = exec->globalData().allocateGlobalHandle();
     97        HandleHeap::heapFor(slot)->makeWeak(slot, m_callbackObjectData.get(), classRef());
     98        HandleHeap::heapFor(slot)->writeBarrier(slot, this);
     99        *slot = this;
     100    }
    101101}
    102102
Note: See TracChangeset for help on using the changeset viewer.