| Index: src/data-flow.h
|
| diff --git a/src/data-flow.h b/src/data-flow.h
|
| index 76cff8898bb5be3cc7efdd58875a47eac23406cc..da921029e7e35196dd3069ace940c3b37f434242 100644
|
| --- a/src/data-flow.h
|
| +++ b/src/data-flow.h
|
| @@ -1,4 +1,4 @@
|
| -// Copyright 2010 the V8 project authors. All rights reserved.
|
| +// Copyright 2011 the V8 project authors. All rights reserved.
|
| // Redistribution and use in source and binary forms, with or without
|
| // modification, are permitted provided that the following conditions are
|
| // met:
|
| @@ -37,9 +37,6 @@
|
| namespace v8 {
|
| namespace internal {
|
|
|
| -// Forward declarations.
|
| -class Node;
|
| -
|
| class BitVector: public ZoneObject {
|
| public:
|
| // Iterator for the elements of this BitVector.
|
| @@ -201,140 +198,6 @@ class BitVector: public ZoneObject {
|
| uint32_t* data_;
|
| };
|
|
|
| -
|
| -// An implementation of a sparse set whose elements are drawn from integers
|
| -// in the range [0..universe_size[. It supports constant-time Contains,
|
| -// destructive Add, and destructuve Remove operations and linear-time (in
|
| -// the number of elements) destructive Union.
|
| -class SparseSet: public ZoneObject {
|
| - public:
|
| - // Iterator for sparse set elements. Elements should not be added or
|
| - // removed during iteration.
|
| - class Iterator BASE_EMBEDDED {
|
| - public:
|
| - explicit Iterator(SparseSet* target) : target_(target), current_(0) {
|
| - ASSERT(++target->iterator_count_ > 0);
|
| - }
|
| - ~Iterator() {
|
| - ASSERT(target_->iterator_count_-- > 0);
|
| - }
|
| - bool Done() const { return current_ >= target_->dense_.length(); }
|
| - void Advance() {
|
| - ASSERT(!Done());
|
| - ++current_;
|
| - }
|
| - int Current() {
|
| - ASSERT(!Done());
|
| - return target_->dense_[current_];
|
| - }
|
| -
|
| - private:
|
| - SparseSet* target_;
|
| - int current_;
|
| -
|
| - friend class SparseSet;
|
| - };
|
| -
|
| - explicit SparseSet(int universe_size)
|
| - : dense_(4),
|
| - sparse_(ZONE->NewArray<int>(universe_size)) {
|
| -#ifdef DEBUG
|
| - size_ = universe_size;
|
| - iterator_count_ = 0;
|
| -#endif
|
| - }
|
| -
|
| - bool Contains(int n) const {
|
| - ASSERT(0 <= n && n < size_);
|
| - int dense_index = sparse_[n];
|
| - return (0 <= dense_index) &&
|
| - (dense_index < dense_.length()) &&
|
| - (dense_[dense_index] == n);
|
| - }
|
| -
|
| - void Add(int n) {
|
| - ASSERT(0 <= n && n < size_);
|
| - ASSERT(iterator_count_ == 0);
|
| - if (!Contains(n)) {
|
| - sparse_[n] = dense_.length();
|
| - dense_.Add(n);
|
| - }
|
| - }
|
| -
|
| - void Remove(int n) {
|
| - ASSERT(0 <= n && n < size_);
|
| - ASSERT(iterator_count_ == 0);
|
| - if (Contains(n)) {
|
| - int dense_index = sparse_[n];
|
| - int last = dense_.RemoveLast();
|
| - if (dense_index < dense_.length()) {
|
| - dense_[dense_index] = last;
|
| - sparse_[last] = dense_index;
|
| - }
|
| - }
|
| - }
|
| -
|
| - void Union(const SparseSet& other) {
|
| - for (int i = 0; i < other.dense_.length(); ++i) {
|
| - Add(other.dense_[i]);
|
| - }
|
| - }
|
| -
|
| - private:
|
| - // The set is implemented as a pair of a growable dense list and an
|
| - // uninitialized sparse array.
|
| - ZoneList<int> dense_;
|
| - int* sparse_;
|
| -#ifdef DEBUG
|
| - int size_;
|
| - int iterator_count_;
|
| -#endif
|
| -};
|
| -
|
| -
|
| -// Simple fixed-capacity list-based worklist (managed as a queue) of
|
| -// pointers to T.
|
| -template<typename T>
|
| -class WorkList BASE_EMBEDDED {
|
| - public:
|
| - // The worklist cannot grow bigger than size. We keep one item empty to
|
| - // distinguish between empty and full.
|
| - explicit WorkList(int size)
|
| - : capacity_(size + 1), head_(0), tail_(0), queue_(capacity_) {
|
| - for (int i = 0; i < capacity_; i++) queue_.Add(NULL);
|
| - }
|
| -
|
| - bool is_empty() { return head_ == tail_; }
|
| -
|
| - bool is_full() {
|
| - // The worklist is full if head is at 0 and tail is at capacity - 1:
|
| - // head == 0 && tail == capacity-1 ==> tail - head == capacity - 1
|
| - // or if tail is immediately to the left of head:
|
| - // tail+1 == head ==> tail - head == -1
|
| - int diff = tail_ - head_;
|
| - return (diff == -1 || diff == capacity_ - 1);
|
| - }
|
| -
|
| - void Insert(T* item) {
|
| - ASSERT(!is_full());
|
| - queue_[tail_++] = item;
|
| - if (tail_ == capacity_) tail_ = 0;
|
| - }
|
| -
|
| - T* Remove() {
|
| - ASSERT(!is_empty());
|
| - T* item = queue_[head_++];
|
| - if (head_ == capacity_) head_ = 0;
|
| - return item;
|
| - }
|
| -
|
| - private:
|
| - int capacity_; // Including one empty slot.
|
| - int head_; // Where the first item is.
|
| - int tail_; // Where the next inserted item will go.
|
| - List<T*> queue_;
|
| -};
|
| -
|
| } } // namespace v8::internal
|
|
|
|
|
|
|