13ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Copyright 2012 the V8 project authors. All rights reserved. 2b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// found in the LICENSE file. 44515c472dc3e5ed2448a564600976759e569a0a8Leon Clarke 54515c472dc3e5ed2448a564600976759e569a0a8Leon Clarke#ifndef V8_DATAFLOW_H_ 64515c472dc3e5ed2448a564600976759e569a0a8Leon Clarke#define V8_DATAFLOW_H_ 74515c472dc3e5ed2448a564600976759e569a0a8Leon Clarke 8b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/v8.h" 96ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 10b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/allocation.h" 11b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/ast.h" 12b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/compiler.h" 13b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/zone-inl.h" 144515c472dc3e5ed2448a564600976759e569a0a8Leon Clarke 154515c472dc3e5ed2448a564600976759e569a0a8Leon Clarkenamespace v8 { 164515c472dc3e5ed2448a564600976759e569a0a8Leon Clarkenamespace internal { 174515c472dc3e5ed2448a564600976759e569a0a8Leon Clarke 186ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockclass BitVector: public ZoneObject { 196ded16be15dd865a9b21ea304d5273c8be299c87Steve Block public: 20b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Iterator for the elements of this BitVector. 21b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch class Iterator BASE_EMBEDDED { 22b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 23b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch explicit Iterator(BitVector* target) 24b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch : target_(target), 25b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch current_index_(0), 26b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch current_value_(target->data_[0]), 27b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch current_(-1) { 28b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(target->data_length_ > 0); 29b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Advance(); 30b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 31b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ~Iterator() { } 32b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 33b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool Done() const { return current_index_ >= target_->data_length_; } 34b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void Advance(); 35b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 36b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int Current() const { 37b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(!Done()); 38b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return current_; 39b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 40b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 41b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 42b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch uint32_t SkipZeroBytes(uint32_t val) { 43b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch while ((val & 0xFF) == 0) { 44b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch val >>= 8; 45b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch current_ += 8; 46b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 47b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return val; 48b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 49b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch uint32_t SkipZeroBits(uint32_t val) { 50b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch while ((val & 0x1) == 0) { 51b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch val >>= 1; 52b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch current_++; 53b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 54b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return val; 55b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 5680d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen 57b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch BitVector* target_; 58b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int current_index_; 59b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch uint32_t current_value_; 60b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int current_; 61b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 62b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch friend class BitVector; 63b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch }; 64b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch BitVector(int length, Zone* zone) 66b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch : length_(length), 67b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch data_length_(SizeFor(length)), 683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch data_(zone->NewArray<uint32_t>(data_length_)) { 69b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(length > 0); 70b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Clear(); 716ded16be15dd865a9b21ea304d5273c8be299c87Steve Block } 726ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch BitVector(const BitVector& other, Zone* zone) 746ded16be15dd865a9b21ea304d5273c8be299c87Steve Block : length_(other.length()), 756ded16be15dd865a9b21ea304d5273c8be299c87Steve Block data_length_(SizeFor(length_)), 763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch data_(zone->NewArray<uint32_t>(data_length_)) { 776ded16be15dd865a9b21ea304d5273c8be299c87Steve Block CopyFrom(other); 786ded16be15dd865a9b21ea304d5273c8be299c87Steve Block } 796ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 80b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch static int SizeFor(int length) { 81b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return 1 + ((length - 1) / 32); 826ded16be15dd865a9b21ea304d5273c8be299c87Steve Block } 836ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 846ded16be15dd865a9b21ea304d5273c8be299c87Steve Block BitVector& operator=(const BitVector& rhs) { 856ded16be15dd865a9b21ea304d5273c8be299c87Steve Block if (this != &rhs) CopyFrom(rhs); 866ded16be15dd865a9b21ea304d5273c8be299c87Steve Block return *this; 876ded16be15dd865a9b21ea304d5273c8be299c87Steve Block } 886ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 896ded16be15dd865a9b21ea304d5273c8be299c87Steve Block void CopyFrom(const BitVector& other) { 90b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(other.length() <= length()); 919fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block for (int i = 0; i < other.data_length_; i++) { 926ded16be15dd865a9b21ea304d5273c8be299c87Steve Block data_[i] = other.data_[i]; 936ded16be15dd865a9b21ea304d5273c8be299c87Steve Block } 949fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block for (int i = other.data_length_; i < data_length_; i++) { 959fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block data_[i] = 0; 969fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block } 976ded16be15dd865a9b21ea304d5273c8be299c87Steve Block } 986ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 99b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool Contains(int i) const { 100b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(i >= 0 && i < length()); 1016ded16be15dd865a9b21ea304d5273c8be299c87Steve Block uint32_t block = data_[i / 32]; 1026ded16be15dd865a9b21ea304d5273c8be299c87Steve Block return (block & (1U << (i % 32))) != 0; 1036ded16be15dd865a9b21ea304d5273c8be299c87Steve Block } 1046ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 1056ded16be15dd865a9b21ea304d5273c8be299c87Steve Block void Add(int i) { 106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(i >= 0 && i < length()); 1076ded16be15dd865a9b21ea304d5273c8be299c87Steve Block data_[i / 32] |= (1U << (i % 32)); 1086ded16be15dd865a9b21ea304d5273c8be299c87Steve Block } 1096ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 1106ded16be15dd865a9b21ea304d5273c8be299c87Steve Block void Remove(int i) { 111b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(i >= 0 && i < length()); 1126ded16be15dd865a9b21ea304d5273c8be299c87Steve Block data_[i / 32] &= ~(1U << (i % 32)); 1136ded16be15dd865a9b21ea304d5273c8be299c87Steve Block } 1146ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 1156ded16be15dd865a9b21ea304d5273c8be299c87Steve Block void Union(const BitVector& other) { 116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(other.length() == length()); 1176ded16be15dd865a9b21ea304d5273c8be299c87Steve Block for (int i = 0; i < data_length_; i++) { 1186ded16be15dd865a9b21ea304d5273c8be299c87Steve Block data_[i] |= other.data_[i]; 1196ded16be15dd865a9b21ea304d5273c8be299c87Steve Block } 1206ded16be15dd865a9b21ea304d5273c8be299c87Steve Block } 1216ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 122b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool UnionIsChanged(const BitVector& other) { 123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(other.length() == length()); 124b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool changed = false; 125b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch for (int i = 0; i < data_length_; i++) { 126b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch uint32_t old_data = data_[i]; 127b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch data_[i] |= other.data_[i]; 128b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (data_[i] != old_data) changed = true; 129b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 130b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return changed; 131b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 132b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1336ded16be15dd865a9b21ea304d5273c8be299c87Steve Block void Intersect(const BitVector& other) { 134b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(other.length() == length()); 1356ded16be15dd865a9b21ea304d5273c8be299c87Steve Block for (int i = 0; i < data_length_; i++) { 1366ded16be15dd865a9b21ea304d5273c8be299c87Steve Block data_[i] &= other.data_[i]; 1376ded16be15dd865a9b21ea304d5273c8be299c87Steve Block } 1386ded16be15dd865a9b21ea304d5273c8be299c87Steve Block } 1396ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 140b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool IntersectIsChanged(const BitVector& other) { 141b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(other.length() == length()); 142b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool changed = false; 143b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int i = 0; i < data_length_; i++) { 144b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t old_data = data_[i]; 145b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch data_[i] &= other.data_[i]; 146b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (data_[i] != old_data) changed = true; 147b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 148b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return changed; 149b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 150b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1516ded16be15dd865a9b21ea304d5273c8be299c87Steve Block void Subtract(const BitVector& other) { 152b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(other.length() == length()); 1536ded16be15dd865a9b21ea304d5273c8be299c87Steve Block for (int i = 0; i < data_length_; i++) { 1546ded16be15dd865a9b21ea304d5273c8be299c87Steve Block data_[i] &= ~other.data_[i]; 1556ded16be15dd865a9b21ea304d5273c8be299c87Steve Block } 1566ded16be15dd865a9b21ea304d5273c8be299c87Steve Block } 1576ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 1586ded16be15dd865a9b21ea304d5273c8be299c87Steve Block void Clear() { 1596ded16be15dd865a9b21ea304d5273c8be299c87Steve Block for (int i = 0; i < data_length_; i++) { 1606ded16be15dd865a9b21ea304d5273c8be299c87Steve Block data_[i] = 0; 1616ded16be15dd865a9b21ea304d5273c8be299c87Steve Block } 1626ded16be15dd865a9b21ea304d5273c8be299c87Steve Block } 1636ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 1646ded16be15dd865a9b21ea304d5273c8be299c87Steve Block bool IsEmpty() const { 1656ded16be15dd865a9b21ea304d5273c8be299c87Steve Block for (int i = 0; i < data_length_; i++) { 1666ded16be15dd865a9b21ea304d5273c8be299c87Steve Block if (data_[i] != 0) return false; 1676ded16be15dd865a9b21ea304d5273c8be299c87Steve Block } 1686ded16be15dd865a9b21ea304d5273c8be299c87Steve Block return true; 1696ded16be15dd865a9b21ea304d5273c8be299c87Steve Block } 1706ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 1716ded16be15dd865a9b21ea304d5273c8be299c87Steve Block bool Equals(const BitVector& other) { 1726ded16be15dd865a9b21ea304d5273c8be299c87Steve Block for (int i = 0; i < data_length_; i++) { 1736ded16be15dd865a9b21ea304d5273c8be299c87Steve Block if (data_[i] != other.data_[i]) return false; 1746ded16be15dd865a9b21ea304d5273c8be299c87Steve Block } 1756ded16be15dd865a9b21ea304d5273c8be299c87Steve Block return true; 1766ded16be15dd865a9b21ea304d5273c8be299c87Steve Block } 1776ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 178b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int Count() const; 179b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1806ded16be15dd865a9b21ea304d5273c8be299c87Steve Block int length() const { return length_; } 1816ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 1826ded16be15dd865a9b21ea304d5273c8be299c87Steve Block#ifdef DEBUG 1836ded16be15dd865a9b21ea304d5273c8be299c87Steve Block void Print(); 1846ded16be15dd865a9b21ea304d5273c8be299c87Steve Block#endif 1856ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 1866ded16be15dd865a9b21ea304d5273c8be299c87Steve Block private: 1876ded16be15dd865a9b21ea304d5273c8be299c87Steve Block int length_; 1886ded16be15dd865a9b21ea304d5273c8be299c87Steve Block int data_length_; 1896ded16be15dd865a9b21ea304d5273c8be299c87Steve Block uint32_t* data_; 1906ded16be15dd865a9b21ea304d5273c8be299c87Steve Block}; 1916ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 1924515c472dc3e5ed2448a564600976759e569a0a8Leon Clarke 193b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass GrowableBitVector BASE_EMBEDDED { 194b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 195b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch class Iterator BASE_EMBEDDED { 196b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 197b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Iterator(const GrowableBitVector* target, Zone* zone) 198b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : it_(target->bits_ == NULL 199b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ? new(zone) BitVector(1, zone) 200b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : target->bits_) { } 201b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool Done() const { return it_.Done(); } 202b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void Advance() { it_.Advance(); } 203b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int Current() const { return it_.Current(); } 204b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 205b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch BitVector::Iterator it_; 206b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch }; 207b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 208b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch GrowableBitVector() : bits_(NULL) { } 209b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch GrowableBitVector(int length, Zone* zone) 210b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : bits_(new(zone) BitVector(length, zone)) { } 211b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 212b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool Contains(int value) const { 213b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!InBitsRange(value)) return false; 214b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return bits_->Contains(value); 215b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 216b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 217b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void Add(int value, Zone* zone) { 218b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureCapacity(value, zone); 219b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bits_->Add(value); 220b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 221b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 222b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void Union(const GrowableBitVector& other, Zone* zone) { 223b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (Iterator it(&other, zone); !it.Done(); it.Advance()) { 224b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Add(it.Current(), zone); 225b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 226b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 227b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 228b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void Clear() { if (bits_ != NULL) bits_->Clear(); } 229b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 230b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 231b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kInitialLength = 1024; 232b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 233b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool InBitsRange(int value) const { 234b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return bits_ != NULL && bits_->length() > value; 235b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 236b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 237b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void EnsureCapacity(int value, Zone* zone) { 238b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (InBitsRange(value)) return; 239b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int new_length = bits_ == NULL ? kInitialLength : bits_->length(); 240b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch while (new_length <= value) new_length *= 2; 241b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch BitVector* new_bits = new(zone) BitVector(new_length, zone); 242b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (bits_ != NULL) new_bits->CopyFrom(*bits_); 243b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bits_ = new_bits; 244b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 245b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 246b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch BitVector* bits_; 247b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 248b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 249b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} // namespace internal 250b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} // namespace v8 251402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu 2524515c472dc3e5ed2448a564600976759e569a0a8Leon Clarke#endif // V8_DATAFLOW_H_ 253