1be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org// Copyright 2012 the V8 project authors. All rights reserved. 23484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// Use of this source code is governed by a BSD-style license that can be 33484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// found in the LICENSE file. 49a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 5b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org#ifndef V8_DATAFLOW_H_ 6b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org#define V8_DATAFLOW_H_ 79a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 8196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/v8.h" 9ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org 10196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/allocation.h" 11196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/ast.h" 12196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/compiler.h" 13196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/zone-inl.h" 149a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 15b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.orgnamespace v8 { 16b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.orgnamespace internal { 179a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 18ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgclass BitVector: public ZoneObject { 19ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org public: 20a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // Iterator for the elements of this BitVector. 21a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org class Iterator BASE_EMBEDDED { 22a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org public: 23a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org explicit Iterator(BitVector* target) 24a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org : target_(target), 25a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org current_index_(0), 26a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org current_value_(target->data_[0]), 27a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org current_(-1) { 28e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(target->data_length_ > 0); 29a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org Advance(); 30a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 31a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org ~Iterator() { } 32a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 33a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org bool Done() const { return current_index_ >= target_->data_length_; } 34a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org void Advance(); 35a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 36a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org int Current() const { 37e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(!Done()); 38a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org return current_; 39a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 40a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 41a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org private: 42a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org uint32_t SkipZeroBytes(uint32_t val) { 43a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org while ((val & 0xFF) == 0) { 44a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org val >>= 8; 45a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org current_ += 8; 46a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 47a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org return val; 48a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 49a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org uint32_t SkipZeroBits(uint32_t val) { 50a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org while ((val & 0x1) == 0) { 51a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org val >>= 1; 52a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org current_++; 53a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 54a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org return val; 55a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 5665fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org 57a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org BitVector* target_; 58a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org int current_index_; 59a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org uint32_t current_value_; 60a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org int current_; 61a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 62a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org friend class BitVector; 63a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org }; 64a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 65be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org BitVector(int length, Zone* zone) 66a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org : length_(length), 67a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org data_length_(SizeFor(length)), 68be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org data_(zone->NewArray<uint32_t>(data_length_)) { 69e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(length > 0); 70a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org Clear(); 71ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org } 72ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org 73be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org BitVector(const BitVector& other, Zone* zone) 74ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org : length_(other.length()), 75ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org data_length_(SizeFor(length_)), 76be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org data_(zone->NewArray<uint32_t>(data_length_)) { 77ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org CopyFrom(other); 78ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org } 79ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org 80a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org static int SizeFor(int length) { 81a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org return 1 + ((length - 1) / 32); 82ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org } 83ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org 84ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org BitVector& operator=(const BitVector& rhs) { 85ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org if (this != &rhs) CopyFrom(rhs); 86ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org return *this; 87ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org } 88ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org 89ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org void CopyFrom(const BitVector& other) { 90e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(other.length() <= length()); 915d00b60c201d860c74821f553fdc34f4e057b411lrn@chromium.org for (int i = 0; i < other.data_length_; i++) { 92ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org data_[i] = other.data_[i]; 93ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org } 945d00b60c201d860c74821f553fdc34f4e057b411lrn@chromium.org for (int i = other.data_length_; i < data_length_; i++) { 955d00b60c201d860c74821f553fdc34f4e057b411lrn@chromium.org data_[i] = 0; 965d00b60c201d860c74821f553fdc34f4e057b411lrn@chromium.org } 97ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org } 98ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org 99a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org bool Contains(int i) const { 100e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(i >= 0 && i < length()); 101ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org uint32_t block = data_[i / 32]; 102ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org return (block & (1U << (i % 32))) != 0; 103ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org } 104ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org 105ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org void Add(int i) { 106e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(i >= 0 && i < length()); 107ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org data_[i / 32] |= (1U << (i % 32)); 108ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org } 109ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org 110ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org void Remove(int i) { 111e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(i >= 0 && i < length()); 112ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org data_[i / 32] &= ~(1U << (i % 32)); 113ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org } 114ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org 115ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org void Union(const BitVector& other) { 116e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(other.length() == length()); 117ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org for (int i = 0; i < data_length_; i++) { 118ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org data_[i] |= other.data_[i]; 119ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org } 120ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org } 121ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org 122a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org bool UnionIsChanged(const BitVector& other) { 123e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(other.length() == length()); 124a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org bool changed = false; 125a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org for (int i = 0; i < data_length_; i++) { 126a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org uint32_t old_data = data_[i]; 127a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org data_[i] |= other.data_[i]; 128a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org if (data_[i] != old_data) changed = true; 129a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 130a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org return changed; 131a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 132a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 133ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org void Intersect(const BitVector& other) { 134e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(other.length() == length()); 135ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org for (int i = 0; i < data_length_; i++) { 136ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org data_[i] &= other.data_[i]; 137ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org } 138ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org } 139ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org 140a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org bool IntersectIsChanged(const BitVector& other) { 141a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org DCHECK(other.length() == length()); 142a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org bool changed = false; 143a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org for (int i = 0; i < data_length_; i++) { 144a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org uint32_t old_data = data_[i]; 145a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org data_[i] &= other.data_[i]; 146a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org if (data_[i] != old_data) changed = true; 147a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org } 148a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org return changed; 149a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org } 150a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org 151f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org void Subtract(const BitVector& other) { 152e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(other.length() == length()); 153f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org for (int i = 0; i < data_length_; i++) { 154f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org data_[i] &= ~other.data_[i]; 155f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org } 156f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org } 157f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org 158ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org void Clear() { 159ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org for (int i = 0; i < data_length_; i++) { 160ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org data_[i] = 0; 161ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org } 162ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org } 163ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org 164ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org bool IsEmpty() const { 165ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org for (int i = 0; i < data_length_; i++) { 166ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org if (data_[i] != 0) return false; 167ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org } 168ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org return true; 169ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org } 170ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org 171f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org bool Equals(const BitVector& other) { 172f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org for (int i = 0; i < data_length_; i++) { 173f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org if (data_[i] != other.data_[i]) return false; 174f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org } 175f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org return true; 176f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org } 177f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org 178e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org int Count() const; 1797d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 180ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org int length() const { return length_; } 181ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org 182086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org#ifdef DEBUG 183086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org void Print(); 184086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org#endif 185086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org 186ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org private: 187ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org int length_; 188ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org int data_length_; 189ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org uint32_t* data_; 190ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org}; 191ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org 192e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org 19359297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.orgclass GrowableBitVector BASE_EMBEDDED { 19459297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org public: 19559297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org class Iterator BASE_EMBEDDED { 19659297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org public: 19759297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org Iterator(const GrowableBitVector* target, Zone* zone) 19859297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org : it_(target->bits_ == NULL 19959297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org ? new(zone) BitVector(1, zone) 20059297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org : target->bits_) { } 20159297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org bool Done() const { return it_.Done(); } 20259297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org void Advance() { it_.Advance(); } 20359297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org int Current() const { return it_.Current(); } 20459297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org private: 20559297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org BitVector::Iterator it_; 20659297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org }; 20759297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org 20859297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org GrowableBitVector() : bits_(NULL) { } 209b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org GrowableBitVector(int length, Zone* zone) 210b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org : bits_(new(zone) BitVector(length, zone)) { } 21159297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org 21259297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org bool Contains(int value) const { 21359297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org if (!InBitsRange(value)) return false; 21459297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org return bits_->Contains(value); 21559297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org } 21659297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org 21759297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org void Add(int value, Zone* zone) { 21859297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org EnsureCapacity(value, zone); 21959297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org bits_->Add(value); 22059297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org } 22159297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org 22259297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org void Union(const GrowableBitVector& other, Zone* zone) { 22359297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org for (Iterator it(&other, zone); !it.Done(); it.Advance()) { 22459297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org Add(it.Current(), zone); 22559297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org } 22659297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org } 22759297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org 22859297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org void Clear() { if (bits_ != NULL) bits_->Clear(); } 22959297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org 23059297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org private: 23159297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org static const int kInitialLength = 1024; 23259297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org 23359297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org bool InBitsRange(int value) const { 23459297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org return bits_ != NULL && bits_->length() > value; 23559297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org } 23659297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org 23759297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org void EnsureCapacity(int value, Zone* zone) { 23859297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org if (InBitsRange(value)) return; 23959297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org int new_length = bits_ == NULL ? kInitialLength : bits_->length(); 24059297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org while (new_length <= value) new_length *= 2; 24159297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org BitVector* new_bits = new(zone) BitVector(new_length, zone); 24259297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org if (bits_ != NULL) new_bits->CopyFrom(*bits_); 24359297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org bits_ = new_bits; 24459297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org } 24559297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org 24659297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org BitVector* bits_; 24759297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org}; 24859297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org 249e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org} // namespace internal 250e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org} // namespace v8 2515c838251403b0be9a882540f1922577abba4c872ager@chromium.org 252b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org#endif // V8_DATAFLOW_H_ 253