Changeset 96760 in webkit for trunk/Source/JavaScriptCore/heap


Ignore:
Timestamp:
Oct 5, 2011, 3:44:36 PM (14 years ago)
Author:
[email protected]
Message:

Added a simpler mechanism for registering one-off finalizers
https://bugs.webkit.org/show_bug.cgi?id=69466

Reviewed by Oliver Hunt.

  • heap/Heap.cpp:

(JSC::Heap::addFinalizer):
(JSC::Heap::FinalizerOwner::finalize):

  • heap/Heap.h: New function for adding an arbitrary finalizer for an

arbitrary cell without declaring any special classes or Handles yourself.

  • runtime/Executable.cpp:

(JSC::ExecutableBase::clearCode):
(JSC::ExecutableBase::clearCodeVirtual):
(JSC::EvalExecutable::clearCodeVirtual):
(JSC::ProgramExecutable::clearCodeVirtual):
(JSC::FunctionExecutable::discardCode):
(JSC::FunctionExecutable::clearCodeVirtual):

  • runtime/Executable.h:

(JSC::ExecutableBase::finishCreation): Use the new mechanism for eager
finalization of executables.

  • runtime/JSGlobalObject.cpp:

(JSC::JSGlobalObject::clearRareData):

  • runtime/JSGlobalObject.h:

(JSC::JSGlobalObject::createRareDataIfNeeded):
(JSC::JSGlobalObject::registerWeakMap): Use the new mechanism for eager
finalization of weak maps.

Location:
trunk/Source/JavaScriptCore/heap
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/heap/Heap.cpp

    r96738 r96760  
    809809}
    810810
     811void Heap::addFinalizer(JSCell* cell, Finalizer finalizer)
     812{
     813    Weak<JSCell> weak(*globalData(), cell, &m_finalizerOwner, reinterpret_cast<void*>(finalizer));
     814    weak.leakHandle(); // Balanced by FinalizerOwner::finalize().
     815}
     816
     817void Heap::FinalizerOwner::finalize(Handle<Unknown> handle, void* context)
     818{
     819    Weak<JSCell> weak(Weak<JSCell>::Adopt, handle);
     820    Finalizer finalizer = reinterpret_cast<Finalizer>(context);
     821    finalizer(weak.get());
     822}
     823
    811824} // namespace JSC
  • trunk/Source/JavaScriptCore/heap/Heap.h

    r96465 r96760  
    9393        void* allocate(size_t);
    9494
     95        typedef void (*Finalizer)(JSCell*);
     96        void addFinalizer(JSCell*, Finalizer);
     97
    9598        void notifyIsSafeToCollect() { m_isSafeToCollect = true; }
    9699        void collectAllGarbage();
     
    131134        static const size_t minExtraCost = 256;
    132135        static const size_t maxExtraCost = 1024 * 1024;
     136       
     137        class FinalizerOwner : public WeakHandleOwner {
     138            virtual void finalize(Handle<Unknown>, void* context);
     139        };
    133140
    134141        bool isValidAllocation(size_t);
     
    194201        HandleStack m_handleStack;
    195202        JettisonedCodeBlocks m_jettisonedCodeBlocks;
     203        FinalizerOwner m_finalizerOwner;
    196204       
    197205        bool m_isSafeToCollect;
Note: See TracChangeset for help on using the changeset viewer.