13b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch// Copyright 2016 the V8 project authors. All rights reserved. 23b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch// Use of this source code is governed by a BSD-style license that can be 33b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch// found in the LICENSE file. 43b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 53b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#ifndef V8_COLLECTOR_H_ 63b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#define V8_COLLECTOR_H_ 73b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 83b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#include "src/checks.h" 9f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch#include "src/list-inl.h" 103b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#include "src/vector.h" 113b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 123b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochnamespace v8 { 133b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochnamespace internal { 143b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 153b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch/* 163b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch * A class that collects values into a backing store. 173b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch * Specialized versions of the class can allow access to the backing store 183b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch * in different ways. 193b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch * There is no guarantee that the backing store is contiguous (and, as a 203b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch * consequence, no guarantees that consecutively added elements are adjacent 213b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch * in memory). The collector may move elements unless it has guaranteed not 223b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch * to. 233b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch */ 243b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochtemplate <typename T, int growth_factor = 2, int max_growth = 1 * MB> 253b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochclass Collector { 263b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch public: 273b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch explicit Collector(int initial_capacity = kMinCapacity) 283b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch : index_(0), size_(0) { 293b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch current_chunk_ = Vector<T>::New(initial_capacity); 303b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } 313b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 323b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch virtual ~Collector() { 333b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // Free backing store (in reverse allocation order). 343b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch current_chunk_.Dispose(); 353b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch for (int i = chunks_.length() - 1; i >= 0; i--) { 363b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch chunks_.at(i).Dispose(); 373b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } 383b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } 393b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 403b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // Add a single element. 413b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch inline void Add(T value) { 423b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch if (index_ >= current_chunk_.length()) { 433b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Grow(1); 443b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } 453b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch current_chunk_[index_] = value; 463b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch index_++; 473b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch size_++; 483b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } 493b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 503b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // Add a block of contiguous elements and return a Vector backed by the 513b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // memory area. 523b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // A basic Collector will keep this vector valid as long as the Collector 533b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // is alive. 543b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch inline Vector<T> AddBlock(int size, T initial_value) { 553b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch DCHECK(size > 0); 563b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch if (size > current_chunk_.length() - index_) { 573b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Grow(size); 583b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } 593b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch T* position = current_chunk_.start() + index_; 603b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch index_ += size; 613b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch size_ += size; 623b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch for (int i = 0; i < size; i++) { 633b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch position[i] = initial_value; 643b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } 653b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch return Vector<T>(position, size); 663b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } 673b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 683b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // Add a contiguous block of elements and return a vector backed 693b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // by the added block. 703b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // A basic Collector will keep this vector valid as long as the Collector 713b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // is alive. 723b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch inline Vector<T> AddBlock(Vector<const T> source) { 733b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch if (source.length() > current_chunk_.length() - index_) { 743b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Grow(source.length()); 753b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } 763b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch T* position = current_chunk_.start() + index_; 773b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch index_ += source.length(); 783b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch size_ += source.length(); 793b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch for (int i = 0; i < source.length(); i++) { 803b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch position[i] = source[i]; 813b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } 823b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch return Vector<T>(position, source.length()); 833b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } 843b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 853b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // Write the contents of the collector into the provided vector. 863b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch void WriteTo(Vector<T> destination) { 873b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch DCHECK(size_ <= destination.length()); 883b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch int position = 0; 893b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch for (int i = 0; i < chunks_.length(); i++) { 903b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Vector<T> chunk = chunks_.at(i); 913b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch for (int j = 0; j < chunk.length(); j++) { 923b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch destination[position] = chunk[j]; 933b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch position++; 943b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } 953b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } 963b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch for (int i = 0; i < index_; i++) { 973b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch destination[position] = current_chunk_[i]; 983b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch position++; 993b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } 1003b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } 1013b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 1023b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // Allocate a single contiguous vector, copy all the collected 1033b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // elements to the vector, and return it. 1043b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // The caller is responsible for freeing the memory of the returned 1053b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // vector (e.g., using Vector::Dispose). 1063b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Vector<T> ToVector() { 1073b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Vector<T> new_store = Vector<T>::New(size_); 1083b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch WriteTo(new_store); 1093b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch return new_store; 1103b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } 1113b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 1123b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // Resets the collector to be empty. 1133b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch virtual void Reset() { 1143b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch for (int i = chunks_.length() - 1; i >= 0; i--) { 1153b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch chunks_.at(i).Dispose(); 1163b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } 1173b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch chunks_.Rewind(0); 1183b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch index_ = 0; 1193b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch size_ = 0; 1203b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } 1213b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 1223b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // Total number of elements added to collector so far. 1233b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch inline int size() { return size_; } 1243b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 1253b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch protected: 1263b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch static const int kMinCapacity = 16; 1273b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch List<Vector<T> > chunks_; 1283b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Vector<T> current_chunk_; // Block of memory currently being written into. 1293b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch int index_; // Current index in current chunk. 1303b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch int size_; // Total number of elements in collector. 1313b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 1323b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // Creates a new current chunk, and stores the old chunk in the chunks_ list. 1333b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch void Grow(int min_capacity) { 1343b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch DCHECK(growth_factor > 1); 1353b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch int new_capacity; 1363b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch int current_length = current_chunk_.length(); 1373b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch if (current_length < kMinCapacity) { 1383b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // The collector started out as empty. 1393b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch new_capacity = min_capacity * growth_factor; 1403b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch if (new_capacity < kMinCapacity) new_capacity = kMinCapacity; 1413b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } else { 1423b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch int growth = current_length * (growth_factor - 1); 1433b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch if (growth > max_growth) { 1443b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch growth = max_growth; 1453b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } 1463b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch new_capacity = current_length + growth; 1473b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch if (new_capacity < min_capacity) { 1483b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch new_capacity = min_capacity + growth; 1493b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } 1503b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } 1513b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch NewChunk(new_capacity); 1523b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch DCHECK(index_ + min_capacity <= current_chunk_.length()); 1533b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } 1543b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 1553b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // Before replacing the current chunk, give a subclass the option to move 1563b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // some of the current data into the new chunk. The function may update 1573b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // the current index_ value to represent data no longer in the current chunk. 1583b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // Returns the initial index of the new chunk (after copied data). 1593b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch virtual void NewChunk(int new_capacity) { 1603b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Vector<T> new_chunk = Vector<T>::New(new_capacity); 1613b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch if (index_ > 0) { 1623b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch chunks_.Add(current_chunk_.SubVector(0, index_)); 1633b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } else { 1643b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch current_chunk_.Dispose(); 1653b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } 1663b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch current_chunk_ = new_chunk; 1673b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch index_ = 0; 1683b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } 1693b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch}; 1703b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 1713b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch/* 1723b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch * A collector that allows sequences of values to be guaranteed to 1733b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch * stay consecutive. 1743b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch * If the backing store grows while a sequence is active, the current 1753b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch * sequence might be moved, but after the sequence is ended, it will 1763b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch * not move again. 1773b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch * NOTICE: Blocks allocated using Collector::AddBlock(int) can move 1783b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch * as well, if inside an active sequence where another element is added. 1793b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch */ 1803b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochtemplate <typename T, int growth_factor = 2, int max_growth = 1 * MB> 1813b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochclass SequenceCollector : public Collector<T, growth_factor, max_growth> { 1823b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch public: 1833b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch explicit SequenceCollector(int initial_capacity) 1843b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch : Collector<T, growth_factor, max_growth>(initial_capacity), 1853b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch sequence_start_(kNoSequence) {} 1863b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 1873b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch virtual ~SequenceCollector() {} 1883b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 1893b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch void StartSequence() { 1903b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch DCHECK(sequence_start_ == kNoSequence); 1913b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch sequence_start_ = this->index_; 1923b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } 1933b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 1943b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Vector<T> EndSequence() { 1953b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch DCHECK(sequence_start_ != kNoSequence); 1963b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch int sequence_start = sequence_start_; 1973b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch sequence_start_ = kNoSequence; 1983b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch if (sequence_start == this->index_) return Vector<T>(); 1993b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch return this->current_chunk_.SubVector(sequence_start, this->index_); 2003b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } 2013b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 2023b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // Drops the currently added sequence, and all collected elements in it. 2033b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch void DropSequence() { 2043b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch DCHECK(sequence_start_ != kNoSequence); 2053b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch int sequence_length = this->index_ - sequence_start_; 2063b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch this->index_ = sequence_start_; 2073b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch this->size_ -= sequence_length; 2083b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch sequence_start_ = kNoSequence; 2093b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } 2103b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 2113b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch virtual void Reset() { 2123b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch sequence_start_ = kNoSequence; 2133b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch this->Collector<T, growth_factor, max_growth>::Reset(); 2143b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } 2153b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 2163b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch private: 2173b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch static const int kNoSequence = -1; 2183b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch int sequence_start_; 2193b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 2203b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // Move the currently active sequence to the new chunk. 2213b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch virtual void NewChunk(int new_capacity) { 2223b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch if (sequence_start_ == kNoSequence) { 2233b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // Fall back on default behavior if no sequence has been started. 2243b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch this->Collector<T, growth_factor, max_growth>::NewChunk(new_capacity); 2253b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch return; 2263b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } 2273b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch int sequence_length = this->index_ - sequence_start_; 2283b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Vector<T> new_chunk = Vector<T>::New(sequence_length + new_capacity); 2293b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch DCHECK(sequence_length < new_chunk.length()); 2303b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch for (int i = 0; i < sequence_length; i++) { 2313b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch new_chunk[i] = this->current_chunk_[sequence_start_ + i]; 2323b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } 2333b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch if (sequence_start_ > 0) { 2343b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch this->chunks_.Add(this->current_chunk_.SubVector(0, sequence_start_)); 2353b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } else { 2363b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch this->current_chunk_.Dispose(); 2373b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } 2383b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch this->current_chunk_ = new_chunk; 2393b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch this->index_ = sequence_length; 2403b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch sequence_start_ = 0; 2413b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } 2423b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch}; 2433b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 2443b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch} // namespace internal 2453b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch} // namespace v8 2463b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 2473b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#endif // V8_COLLECTOR_H_ 248