Ignore:
Timestamp:
Sep 10, 2012, 11:41:05 AM (13 years ago)
Author:
[email protected]
Message:

Combine MarkStack and SlotVisitor into single class
https://bugs.webkit.org/show_bug.cgi?id=96043

Reviewed by Geoff Garen.

Move all of MarkStack into SlotVisitor. The remaining stuff in MarkStack.cpp actually has to do
with MarkStack management/allocation. Cleaned up a few of the header files while I was at it.

  • CMakeLists.txt:
  • GNUmakefile.list.am:
  • JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj:
  • JavaScriptCore.xcodeproj/project.pbxproj:
  • Target.pri:
  • bytecode/CodeBlock.cpp:
  • dfg/DFGCommon.h:
  • heap/GCThreadSharedData.cpp:
  • heap/GCThreadSharedData.h:

(GCThreadSharedData):

  • heap/HeapRootVisitor.h:
  • heap/MarkStack.cpp:

(JSC):

  • heap/MarkStack.h:

(JSC):
(MarkStackSegment):
(JSC::MarkStackSegment::data):
(JSC::MarkStackSegment::capacityFromSize):
(JSC::MarkStackSegment::sizeFromCapacity):
(MarkStackSegmentAllocator):
(MarkStackArray):

  • heap/MarkStackInlineMethods.h:

(JSC::MarkStackArray::postIncTop):
(JSC):
(JSC::MarkStackArray::preDecTop):
(JSC::MarkStackArray::setTopForFullSegment):
(JSC::MarkStackArray::setTopForEmptySegment):
(JSC::MarkStackArray::top):
(JSC::MarkStackArray::validatePrevious):
(JSC::MarkStackArray::append):
(JSC::MarkStackArray::canRemoveLast):
(JSC::MarkStackArray::removeLast):
(JSC::MarkStackArray::isEmpty):
(JSC::MarkStackArray::size):

  • heap/SlotVisitor.cpp: Added.

(JSC):
(JSC::SlotVisitor::SlotVisitor):
(JSC::SlotVisitor::~SlotVisitor):
(JSC::SlotVisitor::setup):
(JSC::SlotVisitor::reset):
(JSC::SlotVisitor::append):
(JSC::visitChildren):
(JSC::SlotVisitor::donateKnownParallel):
(JSC::SlotVisitor::drain):
(JSC::SlotVisitor::drainFromShared):
(JSC::SlotVisitor::mergeOpaqueRoots):
(JSC::SlotVisitor::startCopying):
(JSC::SlotVisitor::allocateNewSpaceSlow):
(JSC::SlotVisitor::allocateNewSpaceOrPin):
(JSC::JSString::tryHashConstLock):
(JSC::JSString::releaseHashConstLock):
(JSC::JSString::shouldTryHashConst):
(JSC::SlotVisitor::internalAppend):
(JSC::SlotVisitor::copyAndAppend):
(JSC::SlotVisitor::doneCopying):
(JSC::SlotVisitor::harvestWeakReferences):
(JSC::SlotVisitor::finalizeUnconditionalFinalizers):
(JSC::SlotVisitor::validate):

  • heap/SlotVisitor.h:

(JSC):
(SlotVisitor):
(JSC::SlotVisitor::sharedData):
(JSC::SlotVisitor::isEmpty):
(JSC::SlotVisitor::visitCount):
(JSC::SlotVisitor::resetChildCount):
(JSC::SlotVisitor::childCount):
(JSC::SlotVisitor::incrementChildCount):
(ParallelModeEnabler):
(JSC::ParallelModeEnabler::ParallelModeEnabler):
(JSC::ParallelModeEnabler::~ParallelModeEnabler):

  • heap/SlotVisitorInlineMethods.h:

(JSC::SlotVisitor::append):
(JSC):
(JSC::SlotVisitor::appendUnbarrieredPointer):
(JSC::SlotVisitor::appendUnbarrieredValue):
(JSC::SlotVisitor::internalAppend):
(JSC::SlotVisitor::addWeakReferenceHarvester):
(JSC::SlotVisitor::addUnconditionalFinalizer):
(JSC::SlotVisitor::addOpaqueRoot):
(JSC::SlotVisitor::containsOpaqueRoot):
(JSC::SlotVisitor::opaqueRootCount):
(JSC::SlotVisitor::mergeOpaqueRootsIfNecessary):
(JSC::SlotVisitor::mergeOpaqueRootsIfProfitable):
(JSC::SlotVisitor::donate):
(JSC::SlotVisitor::donateAndDrain):

  • jit/JITWriteBarrier.h:

(JSC::SlotVisitor::append):

  • jit/JumpReplacementWatchpoint.cpp:
  • runtime/JSCell.h:
  • runtime/Structure.h:

(JSC::SlotVisitor::internalAppend):

  • runtime/WriteBarrier.h:

(JSC):
(JSC::SlotVisitor::append):
(JSC::SlotVisitor::appendValues):

  • yarr/YarrJIT.cpp:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/heap/MarkStackInlineMethods.h

    r126624 r128084  
    3232namespace JSC {
    3333
    34 ALWAYS_INLINE void MarkStack::append(JSValue* slot, size_t count)
     34inline size_t MarkStackArray::postIncTop()
    3535{
    36     for (size_t i = 0; i < count; ++i) {
    37         JSValue& value = slot[i];
    38         internalAppend(value);
    39     }
     36    size_t result = m_top++;
     37    ASSERT(result == m_topSegment->m_top++);
     38    return result;
     39}
     40       
     41inline size_t MarkStackArray::preDecTop()
     42{
     43    size_t result = --m_top;
     44    ASSERT(result == --m_topSegment->m_top);
     45    return result;
     46}
     47       
     48inline void MarkStackArray::setTopForFullSegment()
     49{
     50    ASSERT(m_topSegment->m_top == m_segmentCapacity);
     51    m_top = m_segmentCapacity;
    4052}
    4153
    42 template<typename T>
    43 inline void MarkStack::appendUnbarrieredPointer(T** slot)
     54inline void MarkStackArray::setTopForEmptySegment()
    4455{
    45     ASSERT(slot);
    46     JSCell* cell = *slot;
    47     internalAppend(cell);
     56    ASSERT(!m_topSegment->m_top);
     57    m_top = 0;
    4858}
    4959
    50 ALWAYS_INLINE void MarkStack::append(JSValue* slot)
     60inline size_t MarkStackArray::top()
    5161{
    52     ASSERT(slot);
    53     internalAppend(*slot);
     62    ASSERT(m_top == m_topSegment->m_top);
     63    return m_top;
    5464}
    5565
    56 ALWAYS_INLINE void MarkStack::appendUnbarrieredValue(JSValue* slot)
     66#if ASSERT_DISABLED
     67inline void MarkStackArray::validatePrevious() { }
     68#else
     69inline void MarkStackArray::validatePrevious()
    5770{
    58     ASSERT(slot);
    59     internalAppend(*slot);
     71    unsigned count = 0;
     72    for (MarkStackSegment* current = m_topSegment->m_previous; current; current = current->m_previous)
     73        count++;
     74    ASSERT(count == m_numberOfPreviousSegments);
     75}
     76#endif
     77
     78inline void MarkStackArray::append(const JSCell* cell)
     79{
     80    if (m_top == m_segmentCapacity)
     81        expand();
     82    m_topSegment->data()[postIncTop()] = cell;
    6083}
    6184
    62 ALWAYS_INLINE void MarkStack::append(JSCell** slot)
     85inline bool MarkStackArray::canRemoveLast()
    6386{
    64     ASSERT(slot);
    65     internalAppend(*slot);
     87    return !!m_top;
    6688}
    6789
    68 ALWAYS_INLINE void MarkStack::internalAppend(JSValue value)
     90inline const JSCell* MarkStackArray::removeLast()
    6991{
    70     if (!value || !value.isCell())
    71         return;
    72     internalAppend(value.asCell());
     92    return m_topSegment->data()[preDecTop()];
    7393}
    7494
    75 inline void MarkStack::addWeakReferenceHarvester(WeakReferenceHarvester* weakReferenceHarvester)
     95inline bool MarkStackArray::isEmpty()
    7696{
    77     m_shared.m_weakReferenceHarvesters.addThreadSafe(weakReferenceHarvester);
     97    if (m_top)
     98        return false;
     99    if (m_topSegment->m_previous) {
     100        ASSERT(m_topSegment->m_previous->m_top == m_segmentCapacity);
     101        return false;
     102    }
     103    return true;
    78104}
    79105
    80 inline void MarkStack::addUnconditionalFinalizer(UnconditionalFinalizer* unconditionalFinalizer)
     106inline size_t MarkStackArray::size()
    81107{
    82     m_shared.m_unconditionalFinalizers.addThreadSafe(unconditionalFinalizer);
    83 }
    84 
    85 inline void MarkStack::addOpaqueRoot(void* root)
    86 {
    87 #if ENABLE(PARALLEL_GC)
    88     if (Options::numberOfGCMarkers() == 1) {
    89         // Put directly into the shared HashSet.
    90         m_shared.m_opaqueRoots.add(root);
    91         return;
    92     }
    93     // Put into the local set, but merge with the shared one every once in
    94     // a while to make sure that the local sets don't grow too large.
    95     mergeOpaqueRootsIfProfitable();
    96     m_opaqueRoots.add(root);
    97 #else
    98     m_opaqueRoots.add(root);
    99 #endif
    100 }
    101 
    102 inline bool MarkStack::containsOpaqueRoot(void* root)
    103 {
    104     ASSERT(!m_isInParallelMode);
    105 #if ENABLE(PARALLEL_GC)
    106     ASSERT(m_opaqueRoots.isEmpty());
    107     return m_shared.m_opaqueRoots.contains(root);
    108 #else
    109     return m_opaqueRoots.contains(root);
    110 #endif
    111 }
    112 
    113 inline int MarkStack::opaqueRootCount()
    114 {
    115     ASSERT(!m_isInParallelMode);
    116 #if ENABLE(PARALLEL_GC)
    117     ASSERT(m_opaqueRoots.isEmpty());
    118     return m_shared.m_opaqueRoots.size();
    119 #else
    120     return m_opaqueRoots.size();
    121 #endif
     108    return m_top + m_segmentCapacity * m_numberOfPreviousSegments;
    122109}
    123110
Note: See TracChangeset for help on using the changeset viewer.