145 // configured to throw IndexOutOfBoundsException in constructor |
145 // configured to throw IndexOutOfBoundsException in constructor |
146 class RangeCheckStub: public CodeStub { |
146 class RangeCheckStub: public CodeStub { |
147 private: |
147 private: |
148 CodeEmitInfo* _info; |
148 CodeEmitInfo* _info; |
149 LIR_Opr _index; |
149 LIR_Opr _index; |
|
150 LIR_Opr _array; |
150 bool _throw_index_out_of_bounds_exception; |
151 bool _throw_index_out_of_bounds_exception; |
151 |
152 |
152 public: |
153 public: |
153 RangeCheckStub(CodeEmitInfo* info, LIR_Opr index, bool throw_index_out_of_bounds_exception = false); |
154 // For ArrayIndexOutOfBoundsException. |
|
155 RangeCheckStub(CodeEmitInfo* info, LIR_Opr index, LIR_Opr array); |
|
156 // For IndexOutOfBoundsException. |
|
157 RangeCheckStub(CodeEmitInfo* info, LIR_Opr index); |
154 virtual void emit_code(LIR_Assembler* e); |
158 virtual void emit_code(LIR_Assembler* e); |
155 virtual CodeEmitInfo* info() const { return _info; } |
159 virtual CodeEmitInfo* info() const { return _info; } |
156 virtual bool is_exception_throw_stub() const { return true; } |
160 virtual bool is_exception_throw_stub() const { return true; } |
157 virtual bool is_range_check_stub() const { return true; } |
161 virtual bool is_range_check_stub() const { return true; } |
158 virtual void visit(LIR_OpVisitState* visitor) { |
162 virtual void visit(LIR_OpVisitState* visitor) { |
159 visitor->do_slow_case(_info); |
163 visitor->do_slow_case(_info); |
160 visitor->do_input(_index); |
164 visitor->do_input(_index); |
|
165 if (_array) { visitor->do_input(_array); } |
161 } |
166 } |
162 #ifndef PRODUCT |
167 #ifndef PRODUCT |
163 virtual void print_name(outputStream* out) const { out->print("RangeCheckStub"); } |
168 virtual void print_name(outputStream* out) const { out->print("RangeCheckStub"); } |
164 #endif // PRODUCT |
169 #endif // PRODUCT |
165 }; |
170 }; |