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 337 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
348 | 348 |
349 T* buffer() { return m_buffer; } | 349 T* buffer() { return m_buffer; } |
350 const T* buffer() const { return m_buffer; } | 350 const T* buffer() const { return m_buffer; } |
351 size_t capacity() const { return m_capacity; } | 351 size_t capacity() const { return m_capacity; } |
352 | 352 |
353 void clearUnusedSlots(T* from, T* to) | 353 void clearUnusedSlots(T* from, T* to) |
354 { | 354 { |
355 // If the vector backing is garbage-collected and needs tracing or | 355 // If the vector backing is garbage-collected and needs tracing or |
356 // finalizing, we clear out the unused slots so that the visitor or the | 356 // finalizing, we clear out the unused slots so that the visitor or the |
357 // finalizer does not cause a problem when visiting the unused slots. | 357 // finalizer does not cause a problem when visiting the unused slots. |
358 VectorUnusedSlotClearer<Allocator::isGarbageCollected && (VectorTraits<T
>::needsDestruction || NeedsTracingTrait<VectorTraits<T>>::value), T>::clear(fro
m, to); | 358 VectorUnusedSlotClearer<Allocator::isGarbageCollected && (VectorTraits<T
>::needsDestruction || IsTraceableInCollectionTrait<VectorTraits<T>>::value), T>
::clear(from, to); |
359 } | 359 } |
360 | 360 |
361 void checkUnusedSlots(const T* from, const T* to) | 361 void checkUnusedSlots(const T* from, const T* to) |
362 { | 362 { |
363 #if ENABLE(ASSERT) && !defined(ANNOTATE_CONTIGUOUS_CONTAINER) | 363 #if ENABLE(ASSERT) && !defined(ANNOTATE_CONTIGUOUS_CONTAINER) |
364 VectorUnusedSlotClearer<Allocator::isGarbageCollected && (VectorTraits<T
>::needsDestruction || NeedsTracingTrait<VectorTraits<T>>::value), T>::checkClea
red(from, to); | 364 VectorUnusedSlotClearer<Allocator::isGarbageCollected && (VectorTraits<T
>::needsDestruction || IsTraceableInCollectionTrait<VectorTraits<T>>::value), T>
::checkCleared(from, to); |
365 #endif | 365 #endif |
366 } | 366 } |
367 | 367 |
368 // |end| is exclusive, a la STL. | 368 // |end| is exclusive, a la STL. |
369 struct OffsetRange final { | 369 struct OffsetRange final { |
370 OffsetRange() : begin(0), end(0) { } | 370 OffsetRange() : begin(0), end(0) { } |
371 explicit OffsetRange(size_t begin, size_t end) : begin(begin), end(end)
{ ASSERT(begin <= end); } | 371 explicit OffsetRange(size_t begin, size_t end) : begin(begin), end(end)
{ ASSERT(begin <= end); } |
372 bool empty() const { return begin == end; } | 372 bool empty() const { return begin == end; } |
373 size_t begin; | 373 size_t begin; |
374 size_t end; | 374 size_t end; |
(...skipping 396 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
771 typedef T value_type; | 771 typedef T value_type; |
772 | 772 |
773 typedef T* iterator; | 773 typedef T* iterator; |
774 typedef const T* const_iterator; | 774 typedef const T* const_iterator; |
775 typedef std::reverse_iterator<iterator> reverse_iterator; | 775 typedef std::reverse_iterator<iterator> reverse_iterator; |
776 typedef std::reverse_iterator<const_iterator> const_reverse_iterator; | 776 typedef std::reverse_iterator<const_iterator> const_reverse_iterator; |
777 | 777 |
778 Vector() | 778 Vector() |
779 { | 779 { |
780 static_assert(!std::is_polymorphic<T>::value || !VectorTraits<T>::canIni
tializeWithMemset, "Cannot initialize with memset if there is a vtable"); | 780 static_assert(!std::is_polymorphic<T>::value || !VectorTraits<T>::canIni
tializeWithMemset, "Cannot initialize with memset if there is a vtable"); |
781 static_assert(Allocator::isGarbageCollected || !AllowsOnlyPlacementNew<T
>::value || !NeedsTracing<T>::value, "Cannot put DISALLOW_NEW_EXCEPT_PLACEMENT_N
EW objects that have trace methods into an off-heap Vector"); | 781 static_assert(Allocator::isGarbageCollected || !AllowsOnlyPlacementNew<T
>::value || !IsTraceable<T>::value, "Cannot put DISALLOW_NEW_EXCEPT_PLACEMENT_NE
W objects that have trace methods into an off-heap Vector"); |
782 static_assert(Allocator::isGarbageCollected || !IsPointerToGarbageCollec
tedType<T>::value, "Cannot put raw pointers to garbage-collected classes into an
off-heap Vector. Use HeapVector<Member<T>> instead."); | 782 static_assert(Allocator::isGarbageCollected || !IsPointerToGarbageCollec
tedType<T>::value, "Cannot put raw pointers to garbage-collected classes into an
off-heap Vector. Use HeapVector<Member<T>> instead."); |
783 | 783 |
784 ANNOTATE_NEW_BUFFER(begin(), capacity(), 0); | 784 ANNOTATE_NEW_BUFFER(begin(), capacity(), 0); |
785 m_size = 0; | 785 m_size = 0; |
786 } | 786 } |
787 | 787 |
788 explicit Vector(size_t size) | 788 explicit Vector(size_t size) |
789 : Base(size) | 789 : Base(size) |
790 { | 790 { |
791 static_assert(!std::is_polymorphic<T>::value || !VectorTraits<T>::canIni
tializeWithMemset, "Cannot initialize with memset if there is a vtable"); | 791 static_assert(!std::is_polymorphic<T>::value || !VectorTraits<T>::canIni
tializeWithMemset, "Cannot initialize with memset if there is a vtable"); |
792 static_assert(Allocator::isGarbageCollected || !AllowsOnlyPlacementNew<T
>::value || !NeedsTracing<T>::value, "Cannot put DISALLOW_NEW_EXCEPT_PLACEMENT_N
EW objects that have trace methods into an off-heap Vector"); | 792 static_assert(Allocator::isGarbageCollected || !AllowsOnlyPlacementNew<T
>::value || !IsTraceable<T>::value, "Cannot put DISALLOW_NEW_EXCEPT_PLACEMENT_NE
W objects that have trace methods into an off-heap Vector"); |
793 static_assert(Allocator::isGarbageCollected || !IsPointerToGarbageCollec
tedType<T>::value, "Cannot put raw pointers to garbage-collected classes into an
off-heap Vector. Use HeapVector<Member<T>> instead."); | 793 static_assert(Allocator::isGarbageCollected || !IsPointerToGarbageCollec
tedType<T>::value, "Cannot put raw pointers to garbage-collected classes into an
off-heap Vector. Use HeapVector<Member<T>> instead."); |
794 | 794 |
795 ANNOTATE_NEW_BUFFER(begin(), capacity(), size); | 795 ANNOTATE_NEW_BUFFER(begin(), capacity(), size); |
796 m_size = size; | 796 m_size = size; |
797 TypeOperations::initialize(begin(), end()); | 797 TypeOperations::initialize(begin(), end()); |
798 } | 798 } |
799 | 799 |
800 // Off-GC-heap vectors: Destructor should be called. | 800 // Off-GC-heap vectors: Destructor should be called. |
801 // On-GC-heap vectors: Destructor should be called for inline buffers (if | 801 // On-GC-heap vectors: Destructor should be called for inline buffers (if |
802 // any) but destructor shouldn't be called for vector backing since it is | 802 // any) but destructor shouldn't be called for vector backing since it is |
(...skipping 713 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1516 // This is a performance optimization for a case where the buffer has | 1516 // This is a performance optimization for a case where the buffer has |
1517 // been already traced by somewhere. This can happen if the conservative | 1517 // been already traced by somewhere. This can happen if the conservative |
1518 // scanning traced an on-stack (false-positive or real) pointer to the | 1518 // scanning traced an on-stack (false-positive or real) pointer to the |
1519 // HeapVector, and then visitor->trace() traces the HeapVector. | 1519 // HeapVector, and then visitor->trace() traces the HeapVector. |
1520 if (Allocator::isHeapObjectAlive(buffer())) | 1520 if (Allocator::isHeapObjectAlive(buffer())) |
1521 return; | 1521 return; |
1522 Allocator::markNoTracing(visitor, buffer()); | 1522 Allocator::markNoTracing(visitor, buffer()); |
1523 } | 1523 } |
1524 const T* bufferBegin = buffer(); | 1524 const T* bufferBegin = buffer(); |
1525 const T* bufferEnd = buffer() + size(); | 1525 const T* bufferEnd = buffer() + size(); |
1526 if (NeedsTracingTrait<VectorTraits<T>>::value) { | 1526 if (IsTraceableInCollectionTrait<VectorTraits<T>>::value) { |
1527 for (const T* bufferEntry = bufferBegin; bufferEntry != bufferEnd; buffe
rEntry++) | 1527 for (const T* bufferEntry = bufferBegin; bufferEntry != bufferEnd; buffe
rEntry++) |
1528 Allocator::template trace<VisitorDispatcher, T, VectorTraits<T>>(vis
itor, *const_cast<T*>(bufferEntry)); | 1528 Allocator::template trace<VisitorDispatcher, T, VectorTraits<T>>(vis
itor, *const_cast<T*>(bufferEntry)); |
1529 checkUnusedSlots(buffer() + size(), buffer() + capacity()); | 1529 checkUnusedSlots(buffer() + size(), buffer() + capacity()); |
1530 } | 1530 } |
1531 } | 1531 } |
1532 | 1532 |
1533 } // namespace WTF | 1533 } // namespace WTF |
1534 | 1534 |
1535 using WTF::Vector; | 1535 using WTF::Vector; |
1536 | 1536 |
1537 #endif // WTF_Vector_h | 1537 #endif // WTF_Vector_h |
OLD | NEW |