| Index: runtime/vm/exceptions.h
 | 
| diff --git a/runtime/vm/exceptions.h b/runtime/vm/exceptions.h
 | 
| index c2a3350042b24ec8941869ff52528da1d6f4e385..9debccee01d943307ec70400400afba6e86e586b 100644
 | 
| --- a/runtime/vm/exceptions.h
 | 
| +++ b/runtime/vm/exceptions.h
 | 
| @@ -102,6 +102,65 @@ struct ExceptionHandlerInfo {
 | 
|    int8_t is_generated;         // True if this is a generated handler.
 | 
|  };
 | 
|  
 | 
| +
 | 
| +class CatchEntryState {
 | 
| + public:
 | 
| +  enum { kCatchEntryStateIsMove = 1, kCatchEntryStateDestShift = 1 };
 | 
| +
 | 
| +  CatchEntryState() : data_(NULL), ref_count_(NULL) {}
 | 
| +  explicit CatchEntryState(intptr_t* data)
 | 
| +      : data_(data), ref_count_(new intptr_t(1)) {}
 | 
| +
 | 
| +  CatchEntryState(const CatchEntryState& state) { Copy(state); }
 | 
| +
 | 
| +  ~CatchEntryState() { Destroy(); }
 | 
| +
 | 
| +  CatchEntryState& operator=(const CatchEntryState& state) {
 | 
| +    Destroy();
 | 
| +    Copy(state);
 | 
| +    return *this;
 | 
| +  }
 | 
| +
 | 
| +  bool Empty() { return ref_count_ == NULL; }
 | 
| +
 | 
| +  intptr_t Pairs() { return data_[0]; }
 | 
| +
 | 
| +  intptr_t Src(intptr_t i) { return data_[1 + 2 * i]; }
 | 
| +
 | 
| +  intptr_t Dest(intptr_t i) {
 | 
| +    return data_[2 + 2 * i] >> kCatchEntryStateDestShift;
 | 
| +  }
 | 
| +
 | 
| +  bool isMove(intptr_t i) { return data_[2 + 2 * i] & kCatchEntryStateIsMove; }
 | 
| +
 | 
| + private:
 | 
| +  void Destroy() {
 | 
| +    if (ref_count_ != NULL) {
 | 
| +      (*ref_count_)--;
 | 
| +      if (*ref_count_ == 0) {
 | 
| +        delete ref_count_;
 | 
| +        delete[] data_;
 | 
| +      }
 | 
| +    }
 | 
| +  }
 | 
| +
 | 
| +  void Copy(const CatchEntryState& state) {
 | 
| +    data_ = state.data_;
 | 
| +    ref_count_ = state.ref_count_;
 | 
| +    if (ref_count_ != NULL) {
 | 
| +      (*ref_count_)++;
 | 
| +    }
 | 
| +  }
 | 
| +
 | 
| +  // data_ has the following format:
 | 
| +  // 0 - number of pairs in this state
 | 
| +  // 1-2 - 1st encoded src,dest pair
 | 
| +  // 3-4 - 2nd pair
 | 
| +  // ....
 | 
| +  intptr_t* data_;
 | 
| +  intptr_t* ref_count_;
 | 
| +};
 | 
| +
 | 
|  }  // namespace dart
 | 
|  
 | 
|  #endif  // RUNTIME_VM_EXCEPTIONS_H_
 | 
| 
 |