diff options
Diffstat (limited to 'Source/JavaScriptCore/heap/MarkStackInlineMethods.h')
-rw-r--r-- | Source/JavaScriptCore/heap/MarkStackInlineMethods.h | 105 |
1 files changed, 46 insertions, 59 deletions
diff --git a/Source/JavaScriptCore/heap/MarkStackInlineMethods.h b/Source/JavaScriptCore/heap/MarkStackInlineMethods.h index 031dfff39..d3276d7fa 100644 --- a/Source/JavaScriptCore/heap/MarkStackInlineMethods.h +++ b/Source/JavaScriptCore/heap/MarkStackInlineMethods.h @@ -31,94 +31,81 @@ namespace JSC { -ALWAYS_INLINE void MarkStack::append(JSValue* slot, size_t count) +inline size_t MarkStackArray::postIncTop() { - for (size_t i = 0; i < count; ++i) { - JSValue& value = slot[i]; - internalAppend(value); - } + size_t result = m_top++; + ASSERT(result == m_topSegment->m_top++); + return result; } - -template<typename T> -inline void MarkStack::appendUnbarrieredPointer(T** slot) + +inline size_t MarkStackArray::preDecTop() { - ASSERT(slot); - JSCell* cell = *slot; - internalAppend(cell); + size_t result = --m_top; + ASSERT(result == --m_topSegment->m_top); + return result; } - -ALWAYS_INLINE void MarkStack::append(JSValue* slot) + +inline void MarkStackArray::setTopForFullSegment() { - ASSERT(slot); - internalAppend(*slot); + ASSERT(m_topSegment->m_top == m_segmentCapacity); + m_top = m_segmentCapacity; } -ALWAYS_INLINE void MarkStack::appendUnbarrieredValue(JSValue* slot) +inline void MarkStackArray::setTopForEmptySegment() { - ASSERT(slot); - internalAppend(*slot); + ASSERT(!m_topSegment->m_top); + m_top = 0; } -ALWAYS_INLINE void MarkStack::append(JSCell** slot) +inline size_t MarkStackArray::top() { - ASSERT(slot); - internalAppend(*slot); + ASSERT(m_top == m_topSegment->m_top); + return m_top; } -ALWAYS_INLINE void MarkStack::internalAppend(JSValue value) +#if ASSERT_DISABLED +inline void MarkStackArray::validatePrevious() { } +#else +inline void MarkStackArray::validatePrevious() { - if (!value || !value.isCell()) - return; - internalAppend(value.asCell()); + unsigned count = 0; + for (MarkStackSegment* current = m_topSegment->m_previous; current; current = current->m_previous) + count++; + ASSERT(count == m_numberOfPreviousSegments); } +#endif -inline void MarkStack::addWeakReferenceHarvester(WeakReferenceHarvester* weakReferenceHarvester) +inline void MarkStackArray::append(const JSCell* cell) { - m_shared.m_weakReferenceHarvesters.addThreadSafe(weakReferenceHarvester); + if (m_top == m_segmentCapacity) + expand(); + m_topSegment->data()[postIncTop()] = cell; } -inline void MarkStack::addUnconditionalFinalizer(UnconditionalFinalizer* unconditionalFinalizer) +inline bool MarkStackArray::canRemoveLast() { - m_shared.m_unconditionalFinalizers.addThreadSafe(unconditionalFinalizer); + return !!m_top; } -inline void MarkStack::addOpaqueRoot(void* root) +inline const JSCell* MarkStackArray::removeLast() { -#if ENABLE(PARALLEL_GC) - if (Options::numberOfGCMarkers() == 1) { - // Put directly into the shared HashSet. - m_shared.m_opaqueRoots.add(root); - return; - } - // Put into the local set, but merge with the shared one every once in - // a while to make sure that the local sets don't grow too large. - mergeOpaqueRootsIfProfitable(); - m_opaqueRoots.add(root); -#else - m_opaqueRoots.add(root); -#endif + return m_topSegment->data()[preDecTop()]; } -inline bool MarkStack::containsOpaqueRoot(void* root) +inline bool MarkStackArray::isEmpty() { - ASSERT(!m_isInParallelMode); -#if ENABLE(PARALLEL_GC) - ASSERT(m_opaqueRoots.isEmpty()); - return m_shared.m_opaqueRoots.contains(root); -#else - return m_opaqueRoots.contains(root); -#endif + if (m_top) + return false; + if (m_topSegment->m_previous) { + ASSERT(m_topSegment->m_previous->m_top == m_segmentCapacity); + return false; + } + return true; } -inline int MarkStack::opaqueRootCount() +inline size_t MarkStackArray::size() { - ASSERT(!m_isInParallelMode); -#if ENABLE(PARALLEL_GC) - ASSERT(m_opaqueRoots.isEmpty()); - return m_shared.m_opaqueRoots.size(); -#else - return m_opaqueRoots.size(); -#endif + return m_top + m_segmentCapacity * m_numberOfPreviousSegments; } } // namespace JSC |