Changeset 38887 in webkit for trunk/JavaScriptCore/bytecompiler/SegmentedVector.h
- Timestamp:
- Dec 1, 2008, 5:57:56 PM (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/JavaScriptCore/bytecompiler/SegmentedVector.h
r38856 r38887 38 38 SegmentedVector() 39 39 : m_size(0) 40 , m_currentSegmentIndex(0) 40 41 { 41 42 m_segments.append(&m_inlineSegment); … … 51 52 { 52 53 ASSERT(m_size); 53 return m_segments .last()->last();54 return m_segments[m_currentSegmentIndex]->last(); 54 55 } 55 56 56 57 template <typename U> void append(const U& value) 57 58 { 58 if (!(m_size % SegmentSize) && m_size) 59 m_segments.append(new Segment); 60 m_segments.last()->uncheckedAppend(value); 59 if (!(m_size % SegmentSize) && m_size) { 60 if (m_currentSegmentIndex == m_segments.size() - 1) 61 m_segments.append(new Segment); 62 m_currentSegmentIndex++; 63 } 64 m_segments[m_currentSegmentIndex]->uncheckedAppend(value); 61 65 m_size++; 62 66 } … … 66 70 ASSERT(m_size); 67 71 m_size--; 68 m_segments.last()->removeLast(); 69 if (!(m_size % SegmentSize) && m_size >= SegmentSize) { 70 delete m_segments.last(); 71 m_segments.removeLast(); 72 } 72 m_segments[m_currentSegmentIndex]->removeLast(); 73 if (!(m_size % SegmentSize) && m_size >= SegmentSize) 74 m_currentSegmentIndex--; 73 75 } 74 76 … … 86 88 } 87 89 88 void reserveCapacity(size_t newCapacity)90 void grow(size_t newSize) 89 91 { 90 if (new Capacity<= m_size)92 if (newSize <= m_size) 91 93 return; 92 94 93 if (new Capacity<= SegmentSize) {94 m_inlineSegment.resize(new Capacity);95 m_size = new Capacity;95 if (newSize <= SegmentSize) { 96 m_inlineSegment.resize(newSize); 97 m_size = newSize; 96 98 return; 97 99 } 98 100 99 size_t n umSegments = newCapacity/ SegmentSize;100 size_t extra = new Capacity% SegmentSize;101 size_t newNumSegments = newSize / SegmentSize; 102 size_t extra = newSize % SegmentSize; 101 103 if (extra) 102 n umSegments++;103 size_t old Size= m_segments.size();104 newNumSegments++; 105 size_t oldNumSegments = m_segments.size(); 104 106 105 if (n umSegments == oldSize) {107 if (newNumSegments == oldNumSegments) { 106 108 m_segments.last()->resize(extra); 107 m_size = new Capacity;109 m_size = newSize; 108 110 return; 109 111 } … … 111 113 m_segments.last()->resize(SegmentSize); 112 114 113 m_segments.resize(n umSegments);115 m_segments.resize(newNumSegments); 114 116 115 ASSERT(old Size< m_segments.size());116 for (size_t i = old Size; i < (numSegments - 1); i++) {117 ASSERT(oldNumSegments < m_segments.size()); 118 for (size_t i = oldNumSegments; i < (newNumSegments - 1); i++) { 117 119 Segment* segment = new Segment; 118 120 segment->resize(SegmentSize); … … 122 124 Segment* segment = new Segment; 123 125 segment->resize(extra ? extra : SegmentSize); 124 m_segments[numSegments - 1] = segment; 125 m_size = newCapacity; 126 m_currentSegmentIndex = newNumSegments - 1; 127 m_segments[m_currentSegmentIndex] = segment; 128 m_size = newSize; 126 129 } 127 130 … … 132 135 m_segments.resize(1); 133 136 m_inlineSegment.resize(0); 137 m_currentSegmentIndex = 0; 134 138 m_size = 0; 135 139 } … … 137 141 private: 138 142 typedef Vector<T, SegmentSize> Segment; 143 139 144 size_t m_size; 145 size_t m_currentSegmentIndex; 146 140 147 Segment m_inlineSegment; 141 148 Vector<Segment*, 32> m_segments;
Note:
See TracChangeset
for help on using the changeset viewer.