Chromium Code Reviews| Index: src/utils.h |
| diff --git a/src/utils.h b/src/utils.h |
| index 5a3cd4cb0c07d6f0f5f1207c6876c8ae343434e6..8664b043bf53902bd7a48d9ddd25cc9e2a069421 100644 |
| --- a/src/utils.h |
| +++ b/src/utils.h |
| @@ -615,16 +615,7 @@ class Collector { |
| } |
| } |
| Vector<T> new_chunk = Vector<T>::New(new_capacity); |
|
Rico
2011/09/08 13:42:37
We don't need this new_chunk vector anymore right?
Lasse Reichstein
2011/09/08 13:43:43
Gone.
|
| - int new_index = PrepareGrow(new_chunk); |
| - if (index_ > 0) { |
| - chunks_.Add(current_chunk_.SubVector(0, index_)); |
| - } else { |
| - // Can happen if the call to PrepareGrow moves everything into |
| - // the new chunk. |
| - current_chunk_.Dispose(); |
| - } |
| - current_chunk_ = new_chunk; |
| - index_ = new_index; |
| + NewChunk(new_capacity); |
| ASSERT(index_ + min_capacity <= current_chunk_.length()); |
| } |
| @@ -632,8 +623,15 @@ class Collector { |
| // some of the current data into the new chunk. The function may update |
| // the current index_ value to represent data no longer in the current chunk. |
| // Returns the initial index of the new chunk (after copied data). |
| - virtual int PrepareGrow(Vector<T> new_chunk) { |
| - return 0; |
| + virtual void NewChunk(int new_capacity) { |
| + Vector<T> new_chunk = Vector<T>::New(new_capacity); |
| + if (index_ > 0) { |
| + chunks_.Add(current_chunk_.SubVector(0, index_)); |
| + } else { |
| + current_chunk_.Dispose(); |
| + } |
| + current_chunk_ = new_chunk; |
| + index_ = 0; |
| } |
| }; |
| @@ -688,20 +686,26 @@ class SequenceCollector : public Collector<T, growth_factor, max_growth> { |
| int sequence_start_; |
| // Move the currently active sequence to the new chunk. |
| - virtual int PrepareGrow(Vector<T> new_chunk) { |
| - if (sequence_start_ != kNoSequence) { |
| - int sequence_length = this->index_ - sequence_start_; |
| - // The new chunk is always larger than the current chunk, so there |
| - // is room for the copy. |
| - ASSERT(sequence_length < new_chunk.length()); |
| - for (int i = 0; i < sequence_length; i++) { |
| - new_chunk[i] = this->current_chunk_[sequence_start_ + i]; |
| - } |
| - this->index_ = sequence_start_; |
| - sequence_start_ = 0; |
| - return sequence_length; |
| + virtual void NewChunk(int new_capacity) { |
| + if (sequence_start_ == kNoSequence) { |
| + // Fall back on default behavior if no sequence has been started. |
| + this->Collector<T, growth_factor, max_growth>::NewChunk(new_capacity); |
| + return; |
| } |
| - return 0; |
| + int sequence_length = this->index_ - sequence_start_; |
| + Vector<T> new_chunk = Vector<T>::New(sequence_length + new_capacity); |
| + ASSERT(sequence_length < new_chunk.length()); |
| + for (int i = 0; i < sequence_length; i++) { |
| + new_chunk[i] = this->current_chunk_[sequence_start_ + i]; |
| + } |
| + if (sequence_start_ > 0) { |
| + this->chunks_.Add(this->current_chunk_.SubVector(0, sequence_start_)); |
| + } else { |
| + this->current_chunk_.Dispose(); |
| + } |
| + this->current_chunk_ = new_chunk; |
| + this->index_ = sequence_length; |
| + sequence_start_ = 0; |
| } |
| }; |