Changeset 128084 in webkit for trunk/Source/JavaScriptCore/heap/MarkStackInlineMethods.h
- Timestamp:
- Sep 10, 2012, 11:41:05 AM (13 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/heap/MarkStackInlineMethods.h
r126624 r128084 32 32 namespace JSC { 33 33 34 ALWAYS_INLINE void MarkStack::append(JSValue* slot, size_t count)34 inline size_t MarkStackArray::postIncTop() 35 35 { 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 41 inline size_t MarkStackArray::preDecTop() 42 { 43 size_t result = --m_top; 44 ASSERT(result == --m_topSegment->m_top); 45 return result; 46 } 47 48 inline void MarkStackArray::setTopForFullSegment() 49 { 50 ASSERT(m_topSegment->m_top == m_segmentCapacity); 51 m_top = m_segmentCapacity; 40 52 } 41 53 42 template<typename T> 43 inline void MarkStack::appendUnbarrieredPointer(T** slot) 54 inline void MarkStackArray::setTopForEmptySegment() 44 55 { 45 ASSERT(slot); 46 JSCell* cell = *slot; 47 internalAppend(cell); 56 ASSERT(!m_topSegment->m_top); 57 m_top = 0; 48 58 } 49 59 50 ALWAYS_INLINE void MarkStack::append(JSValue* slot)60 inline size_t MarkStackArray::top() 51 61 { 52 ASSERT( slot);53 internalAppend(*slot);62 ASSERT(m_top == m_topSegment->m_top); 63 return m_top; 54 64 } 55 65 56 ALWAYS_INLINE void MarkStack::appendUnbarrieredValue(JSValue* slot) 66 #if ASSERT_DISABLED 67 inline void MarkStackArray::validatePrevious() { } 68 #else 69 inline void MarkStackArray::validatePrevious() 57 70 { 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 78 inline void MarkStackArray::append(const JSCell* cell) 79 { 80 if (m_top == m_segmentCapacity) 81 expand(); 82 m_topSegment->data()[postIncTop()] = cell; 60 83 } 61 84 62 ALWAYS_INLINE void MarkStack::append(JSCell** slot)85 inline bool MarkStackArray::canRemoveLast() 63 86 { 64 ASSERT(slot); 65 internalAppend(*slot); 87 return !!m_top; 66 88 } 67 89 68 ALWAYS_INLINE void MarkStack::internalAppend(JSValue value)90 inline const JSCell* MarkStackArray::removeLast() 69 91 { 70 if (!value || !value.isCell()) 71 return; 72 internalAppend(value.asCell()); 92 return m_topSegment->data()[preDecTop()]; 73 93 } 74 94 75 inline void MarkStack::addWeakReferenceHarvester(WeakReferenceHarvester* weakReferenceHarvester)95 inline bool MarkStackArray::isEmpty() 76 96 { 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; 78 104 } 79 105 80 inline void MarkStack::addUnconditionalFinalizer(UnconditionalFinalizer* unconditionalFinalizer)106 inline size_t MarkStackArray::size() 81 107 { 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; 122 109 } 123 110
Note:
See TracChangeset
for help on using the changeset viewer.