| Index: src/lithium.h
 | 
| ===================================================================
 | 
| --- src/lithium.h	(revision 6471)
 | 
| +++ src/lithium.h	(working copy)
 | 
| @@ -509,6 +509,82 @@
 | 
|    friend class LCodegen;
 | 
|  };
 | 
|  
 | 
| +
 | 
| +// Iterates over the non-null, non-constant operands in an environment.
 | 
| +class ShallowIterator BASE_EMBEDDED {
 | 
| + public:
 | 
| +  explicit ShallowIterator(LEnvironment* env)
 | 
| +      : env_(env),
 | 
| +        limit_(env != NULL ? env->values()->length() : 0),
 | 
| +        current_(0) {
 | 
| +    current_ = AdvanceToNext(0);
 | 
| +  }
 | 
| +
 | 
| +  inline bool HasNext() {
 | 
| +    return env_ != NULL && current_ < limit_;
 | 
| +  }
 | 
| +
 | 
| +  inline LOperand* Next() {
 | 
| +    ASSERT(HasNext());
 | 
| +    return env_->values()->at(current_);
 | 
| +  }
 | 
| +
 | 
| +  inline void Advance() {
 | 
| +    current_ = AdvanceToNext(current_ + 1);
 | 
| +  }
 | 
| +
 | 
| +  inline LEnvironment* env() { return env_; }
 | 
| +
 | 
| + private:
 | 
| +  inline int AdvanceToNext(int start) {
 | 
| +    while (start < limit_ &&
 | 
| +           (env_->values()->at(start) == NULL ||
 | 
| +            env_->values()->at(start)->IsConstantOperand())) {
 | 
| +      start++;
 | 
| +    }
 | 
| +    return start;
 | 
| +  }
 | 
| +
 | 
| +  LEnvironment* env_;
 | 
| +  int limit_;
 | 
| +  int current_;
 | 
| +};
 | 
| +
 | 
| +
 | 
| +// Iterator for non-null, non-constant operands incl. outer environments.
 | 
| +class DeepIterator BASE_EMBEDDED {
 | 
| + public:
 | 
| +  explicit DeepIterator(LEnvironment* env)
 | 
| +      : current_iterator_(env) { }
 | 
| +
 | 
| +  inline bool HasNext() {
 | 
| +    if (current_iterator_.HasNext()) return true;
 | 
| +    if (current_iterator_.env() == NULL) return false;
 | 
| +    AdvanceToOuter();
 | 
| +    return current_iterator_.HasNext();
 | 
| +  }
 | 
| +
 | 
| +  inline LOperand* Next() {
 | 
| +    ASSERT(current_iterator_.HasNext());
 | 
| +    return current_iterator_.Next();
 | 
| +  }
 | 
| +
 | 
| +  inline void Advance() {
 | 
| +    if (current_iterator_.HasNext()) {
 | 
| +      current_iterator_.Advance();
 | 
| +    } else {
 | 
| +      AdvanceToOuter();
 | 
| +    }
 | 
| +  }
 | 
| +
 | 
| + private:
 | 
| +  inline void AdvanceToOuter() {
 | 
| +    current_iterator_ = ShallowIterator(current_iterator_.env()->outer());
 | 
| +  }
 | 
| +
 | 
| +  ShallowIterator current_iterator_;
 | 
| +};
 | 
| +
 | 
|  } }  // namespace v8::internal
 | 
|  
 | 
|  #endif  // V8_LITHIUM_H_
 | 
| 
 |