OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2005, 2006, 2007, 2008 Apple Inc. All rights reserved. | 2 * Copyright (C) 2005, 2006, 2007, 2008 Apple Inc. All rights reserved. |
3 * | 3 * |
4 * This library is free software; you can redistribute it and/or | 4 * This library is free software; you can redistribute it and/or |
5 * modify it under the terms of the GNU Library General Public | 5 * modify it under the terms of the GNU Library General Public |
6 * License as published by the Free Software Foundation; either | 6 * License as published by the Free Software Foundation; either |
7 * version 2 of the License, or (at your option) any later version. | 7 * version 2 of the License, or (at your option) any later version. |
8 * | 8 * |
9 * This library is distributed in the hope that it will be useful, | 9 * This library is distributed in the hope that it will be useful, |
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of | 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
(...skipping 474 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
485 | 485 |
486 using Base::clearUnusedSlots; | 486 using Base::clearUnusedSlots; |
487 using Base::checkUnusedSlots; | 487 using Base::checkUnusedSlots; |
488 | 488 |
489 bool hasOutOfLineBuffer() const { | 489 bool hasOutOfLineBuffer() const { |
490 // When inlineCapacity is 0 we have an out of line buffer if we have a | 490 // When inlineCapacity is 0 we have an out of line buffer if we have a |
491 // buffer. | 491 // buffer. |
492 return buffer(); | 492 return buffer(); |
493 } | 493 } |
494 | 494 |
| 495 T** bufferSlot() { return &m_buffer; } |
| 496 |
495 protected: | 497 protected: |
496 using Base::m_size; | 498 using Base::m_size; |
497 | 499 |
498 private: | 500 private: |
499 using Base::m_buffer; | 501 using Base::m_buffer; |
500 using Base::m_capacity; | 502 using Base::m_capacity; |
501 }; | 503 }; |
502 | 504 |
503 template <typename T, size_t inlineCapacity, typename Allocator> | 505 template <typename T, size_t inlineCapacity, typename Allocator> |
504 class VectorBuffer : protected VectorBufferBase<T, true, Allocator> { | 506 class VectorBuffer : protected VectorBufferBase<T, true, Allocator> { |
(...skipping 259 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
764 Allocator::leaveGCForbiddenScope(); | 766 Allocator::leaveGCForbiddenScope(); |
765 } | 767 } |
766 | 768 |
767 using Base::buffer; | 769 using Base::buffer; |
768 using Base::capacity; | 770 using Base::capacity; |
769 | 771 |
770 bool hasOutOfLineBuffer() const { | 772 bool hasOutOfLineBuffer() const { |
771 return buffer() && buffer() != inlineBuffer(); | 773 return buffer() && buffer() != inlineBuffer(); |
772 } | 774 } |
773 | 775 |
| 776 T** bufferSlot() { return &m_buffer; } |
| 777 |
774 protected: | 778 protected: |
775 using Base::m_size; | 779 using Base::m_size; |
776 | 780 |
777 private: | 781 private: |
778 using Base::m_buffer; | 782 using Base::m_buffer; |
779 using Base::m_capacity; | 783 using Base::m_capacity; |
780 | 784 |
781 static const size_t m_inlineBufferSize = inlineCapacity * sizeof(T); | 785 static const size_t m_inlineBufferSize = inlineCapacity * sizeof(T); |
782 T* inlineBuffer() { return reinterpret_cast_ptr<T*>(m_inlineBuffer.buffer); } | 786 T* inlineBuffer() { return reinterpret_cast_ptr<T*>(m_inlineBuffer.buffer); } |
783 const T* inlineBuffer() const { | 787 const T* inlineBuffer() const { |
(...skipping 812 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1596 if (!buffer()) | 1600 if (!buffer()) |
1597 return; | 1601 return; |
1598 if (this->hasOutOfLineBuffer()) { | 1602 if (this->hasOutOfLineBuffer()) { |
1599 // This is a performance optimization for a case where the buffer has | 1603 // This is a performance optimization for a case where the buffer has |
1600 // been already traced by somewhere. This can happen if the conservative | 1604 // been already traced by somewhere. This can happen if the conservative |
1601 // scanning traced an on-stack (false-positive or real) pointer to the | 1605 // scanning traced an on-stack (false-positive or real) pointer to the |
1602 // HeapVector, and then visitor->trace() traces the HeapVector. | 1606 // HeapVector, and then visitor->trace() traces the HeapVector. |
1603 if (Allocator::isHeapObjectAlive(buffer())) | 1607 if (Allocator::isHeapObjectAlive(buffer())) |
1604 return; | 1608 return; |
1605 Allocator::markNoTracing(visitor, buffer()); | 1609 Allocator::markNoTracing(visitor, buffer()); |
| 1610 Allocator::registerBackingStoreReference(visitor, Base::bufferSlot()); |
1606 } | 1611 } |
1607 const T* bufferBegin = buffer(); | 1612 const T* bufferBegin = buffer(); |
1608 const T* bufferEnd = buffer() + size(); | 1613 const T* bufferEnd = buffer() + size(); |
1609 if (IsTraceableInCollectionTrait<VectorTraits<T>>::value) { | 1614 if (IsTraceableInCollectionTrait<VectorTraits<T>>::value) { |
1610 for (const T* bufferEntry = bufferBegin; bufferEntry != bufferEnd; | 1615 for (const T* bufferEntry = bufferBegin; bufferEntry != bufferEnd; |
1611 bufferEntry++) | 1616 bufferEntry++) |
1612 Allocator::template trace<VisitorDispatcher, T, VectorTraits<T>>( | 1617 Allocator::template trace<VisitorDispatcher, T, VectorTraits<T>>( |
1613 visitor, *const_cast<T*>(bufferEntry)); | 1618 visitor, *const_cast<T*>(bufferEntry)); |
1614 checkUnusedSlots(buffer() + size(), buffer() + capacity()); | 1619 checkUnusedSlots(buffer() + size(), buffer() + capacity()); |
1615 } | 1620 } |
1616 } | 1621 } |
1617 | 1622 |
1618 } // namespace WTF | 1623 } // namespace WTF |
1619 | 1624 |
1620 using WTF::Vector; | 1625 using WTF::Vector; |
1621 | 1626 |
1622 #endif // WTF_Vector_h | 1627 #endif // WTF_Vector_h |
OLD | NEW |