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