| OLD | NEW | 
|---|
| 1 // Copyright 2010 the V8 project authors. All rights reserved. | 1 // Copyright 2011 the V8 project authors. All rights reserved. | 
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without | 
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are | 
| 4 // met: | 4 // met: | 
| 5 // | 5 // | 
| 6 //     * Redistributions of source code must retain the above copyright | 6 //     * Redistributions of source code must retain the above copyright | 
| 7 //       notice, this list of conditions and the following disclaimer. | 7 //       notice, this list of conditions and the following disclaimer. | 
| 8 //     * Redistributions in binary form must reproduce the above | 8 //     * Redistributions in binary form must reproduce the above | 
| 9 //       copyright notice, this list of conditions and the following | 9 //       copyright notice, this list of conditions and the following | 
| 10 //       disclaimer in the documentation and/or other materials provided | 10 //       disclaimer in the documentation and/or other materials provided | 
| 11 //       with the distribution. | 11 //       with the distribution. | 
| (...skipping 18 matching lines...) Expand all  Loading... | 
| 30 | 30 | 
| 31 #include "v8.h" | 31 #include "v8.h" | 
| 32 | 32 | 
| 33 #include "ast.h" | 33 #include "ast.h" | 
| 34 #include "compiler.h" | 34 #include "compiler.h" | 
| 35 #include "zone-inl.h" | 35 #include "zone-inl.h" | 
| 36 | 36 | 
| 37 namespace v8 { | 37 namespace v8 { | 
| 38 namespace internal { | 38 namespace internal { | 
| 39 | 39 | 
| 40 // Forward declarations. |  | 
| 41 class Node; |  | 
| 42 |  | 
| 43 class BitVector: public ZoneObject { | 40 class BitVector: public ZoneObject { | 
| 44  public: | 41  public: | 
| 45   // Iterator for the elements of this BitVector. | 42   // Iterator for the elements of this BitVector. | 
| 46   class Iterator BASE_EMBEDDED { | 43   class Iterator BASE_EMBEDDED { | 
| 47    public: | 44    public: | 
| 48     explicit Iterator(BitVector* target) | 45     explicit Iterator(BitVector* target) | 
| 49         : target_(target), | 46         : target_(target), | 
| 50           current_index_(0), | 47           current_index_(0), | 
| 51           current_value_(target->data_[0]), | 48           current_value_(target->data_[0]), | 
| 52           current_(-1) { | 49           current_(-1) { | 
| (...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 194 #ifdef DEBUG | 191 #ifdef DEBUG | 
| 195   void Print(); | 192   void Print(); | 
| 196 #endif | 193 #endif | 
| 197 | 194 | 
| 198  private: | 195  private: | 
| 199   int length_; | 196   int length_; | 
| 200   int data_length_; | 197   int data_length_; | 
| 201   uint32_t* data_; | 198   uint32_t* data_; | 
| 202 }; | 199 }; | 
| 203 | 200 | 
| 204 |  | 
| 205 // An implementation of a sparse set whose elements are drawn from integers |  | 
| 206 // in the range [0..universe_size[.  It supports constant-time Contains, |  | 
| 207 // destructive Add, and destructuve Remove operations and linear-time (in |  | 
| 208 // the number of elements) destructive Union. |  | 
| 209 class SparseSet: public ZoneObject { |  | 
| 210  public: |  | 
| 211   // Iterator for sparse set elements.  Elements should not be added or |  | 
| 212   // removed during iteration. |  | 
| 213   class Iterator BASE_EMBEDDED { |  | 
| 214    public: |  | 
| 215     explicit Iterator(SparseSet* target) : target_(target), current_(0) { |  | 
| 216       ASSERT(++target->iterator_count_ > 0); |  | 
| 217     } |  | 
| 218     ~Iterator() { |  | 
| 219       ASSERT(target_->iterator_count_-- > 0); |  | 
| 220     } |  | 
| 221     bool Done() const { return current_ >= target_->dense_.length(); } |  | 
| 222     void Advance() { |  | 
| 223       ASSERT(!Done()); |  | 
| 224       ++current_; |  | 
| 225     } |  | 
| 226     int Current() { |  | 
| 227       ASSERT(!Done()); |  | 
| 228       return target_->dense_[current_]; |  | 
| 229     } |  | 
| 230 |  | 
| 231    private: |  | 
| 232     SparseSet* target_; |  | 
| 233     int current_; |  | 
| 234 |  | 
| 235     friend class SparseSet; |  | 
| 236   }; |  | 
| 237 |  | 
| 238   explicit SparseSet(int universe_size) |  | 
| 239       : dense_(4), |  | 
| 240         sparse_(ZONE->NewArray<int>(universe_size)) { |  | 
| 241 #ifdef DEBUG |  | 
| 242     size_ = universe_size; |  | 
| 243     iterator_count_ = 0; |  | 
| 244 #endif |  | 
| 245   } |  | 
| 246 |  | 
| 247   bool Contains(int n) const { |  | 
| 248     ASSERT(0 <= n && n < size_); |  | 
| 249     int dense_index = sparse_[n]; |  | 
| 250     return (0 <= dense_index) && |  | 
| 251         (dense_index < dense_.length()) && |  | 
| 252         (dense_[dense_index] == n); |  | 
| 253   } |  | 
| 254 |  | 
| 255   void Add(int n) { |  | 
| 256     ASSERT(0 <= n && n < size_); |  | 
| 257     ASSERT(iterator_count_ == 0); |  | 
| 258     if (!Contains(n)) { |  | 
| 259       sparse_[n] = dense_.length(); |  | 
| 260       dense_.Add(n); |  | 
| 261     } |  | 
| 262   } |  | 
| 263 |  | 
| 264   void Remove(int n) { |  | 
| 265     ASSERT(0 <= n && n < size_); |  | 
| 266     ASSERT(iterator_count_ == 0); |  | 
| 267     if (Contains(n)) { |  | 
| 268       int dense_index = sparse_[n]; |  | 
| 269       int last = dense_.RemoveLast(); |  | 
| 270       if (dense_index < dense_.length()) { |  | 
| 271         dense_[dense_index] = last; |  | 
| 272         sparse_[last] = dense_index; |  | 
| 273       } |  | 
| 274     } |  | 
| 275   } |  | 
| 276 |  | 
| 277   void Union(const SparseSet& other) { |  | 
| 278     for (int i = 0; i < other.dense_.length(); ++i) { |  | 
| 279       Add(other.dense_[i]); |  | 
| 280     } |  | 
| 281   } |  | 
| 282 |  | 
| 283  private: |  | 
| 284   // The set is implemented as a pair of a growable dense list and an |  | 
| 285   // uninitialized sparse array. |  | 
| 286   ZoneList<int> dense_; |  | 
| 287   int* sparse_; |  | 
| 288 #ifdef DEBUG |  | 
| 289   int size_; |  | 
| 290   int iterator_count_; |  | 
| 291 #endif |  | 
| 292 }; |  | 
| 293 |  | 
| 294 |  | 
| 295 // Simple fixed-capacity list-based worklist (managed as a queue) of |  | 
| 296 // pointers to T. |  | 
| 297 template<typename T> |  | 
| 298 class WorkList BASE_EMBEDDED { |  | 
| 299  public: |  | 
| 300   // The worklist cannot grow bigger than size.  We keep one item empty to |  | 
| 301   // distinguish between empty and full. |  | 
| 302   explicit WorkList(int size) |  | 
| 303       : capacity_(size + 1), head_(0), tail_(0), queue_(capacity_) { |  | 
| 304     for (int i = 0; i < capacity_; i++) queue_.Add(NULL); |  | 
| 305   } |  | 
| 306 |  | 
| 307   bool is_empty() { return head_ == tail_; } |  | 
| 308 |  | 
| 309   bool is_full() { |  | 
| 310     // The worklist is full if head is at 0 and tail is at capacity - 1: |  | 
| 311     //   head == 0 && tail == capacity-1 ==> tail - head == capacity - 1 |  | 
| 312     // or if tail is immediately to the left of head: |  | 
| 313     //   tail+1 == head  ==> tail - head == -1 |  | 
| 314     int diff = tail_ - head_; |  | 
| 315     return (diff == -1 || diff == capacity_ - 1); |  | 
| 316   } |  | 
| 317 |  | 
| 318   void Insert(T* item) { |  | 
| 319     ASSERT(!is_full()); |  | 
| 320     queue_[tail_++] = item; |  | 
| 321     if (tail_ == capacity_) tail_ = 0; |  | 
| 322   } |  | 
| 323 |  | 
| 324   T* Remove() { |  | 
| 325     ASSERT(!is_empty()); |  | 
| 326     T* item = queue_[head_++]; |  | 
| 327     if (head_ == capacity_) head_ = 0; |  | 
| 328     return item; |  | 
| 329   } |  | 
| 330 |  | 
| 331  private: |  | 
| 332   int capacity_;  // Including one empty slot. |  | 
| 333   int head_;      // Where the first item is. |  | 
| 334   int tail_;      // Where the next inserted item will go. |  | 
| 335   List<T*> queue_; |  | 
| 336 }; |  | 
| 337 |  | 
| 338 } }  // namespace v8::internal | 201 } }  // namespace v8::internal | 
| 339 | 202 | 
| 340 | 203 | 
| 341 #endif  // V8_DATAFLOW_H_ | 204 #endif  // V8_DATAFLOW_H_ | 
| OLD | NEW | 
|---|