summaryrefslogtreecommitdiff
path: root/Source/JavaScriptCore/heap/MarkStackInlineMethods.h
diff options
context:
space:
mode:
Diffstat (limited to 'Source/JavaScriptCore/heap/MarkStackInlineMethods.h')
-rw-r--r--Source/JavaScriptCore/heap/MarkStackInlineMethods.h105
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