134 visitor->do_slow_case(); 135 visitor->do_input(_input); 136 visitor->do_output(_result); 137 } 138 #ifndef PRODUCT 139 virtual void print_name(outputStream* out) const { out->print("ConversionStub"); } 140 #endif // PRODUCT 141 }; 142 143 144 // Throws ArrayIndexOutOfBoundsException by default but can be 145 // configured to throw IndexOutOfBoundsException in constructor 146 class RangeCheckStub: public CodeStub { 147 private: 148 CodeEmitInfo* _info; 149 LIR_Opr _index; 150 LIR_Opr _array; 151 bool _throw_index_out_of_bounds_exception; 152 153 public: 154 RangeCheckStub(CodeEmitInfo* info, LIR_Opr index, LIR_Opr array); 155 virtual void emit_code(LIR_Assembler* e); 156 virtual CodeEmitInfo* info() const { return _info; } 157 virtual bool is_exception_throw_stub() const { return true; } 158 virtual bool is_range_check_stub() const { return true; } 159 virtual void visit(LIR_OpVisitState* visitor) { 160 visitor->do_slow_case(_info); 161 visitor->do_input(_index); 162 if (_array) { visitor->do_input(_array); } 163 } 164 #ifndef PRODUCT 165 virtual void print_name(outputStream* out) const { out->print("RangeCheckStub"); } 166 #endif // PRODUCT 167 }; 168 169 // stub used when predicate fails and deoptimization is needed 170 class PredicateFailedStub: public CodeStub { 171 private: 172 CodeEmitInfo* _info; 173 174 public: | 134 visitor->do_slow_case(); 135 visitor->do_input(_input); 136 visitor->do_output(_result); 137 } 138 #ifndef PRODUCT 139 virtual void print_name(outputStream* out) const { out->print("ConversionStub"); } 140 #endif // PRODUCT 141 }; 142 143 144 // Throws ArrayIndexOutOfBoundsException by default but can be 145 // configured to throw IndexOutOfBoundsException in constructor 146 class RangeCheckStub: public CodeStub { 147 private: 148 CodeEmitInfo* _info; 149 LIR_Opr _index; 150 LIR_Opr _array; 151 bool _throw_index_out_of_bounds_exception; 152 153 public: 154 // For ArrayIndexOutOfBoundsException. 155 RangeCheckStub(CodeEmitInfo* info, LIR_Opr index, LIR_Opr array); 156 // For IndexOutOfBoundsException. 157 RangeCheckStub(CodeEmitInfo* info, LIR_Opr index); 158 virtual void emit_code(LIR_Assembler* e); 159 virtual CodeEmitInfo* info() const { return _info; } 160 virtual bool is_exception_throw_stub() const { return true; } 161 virtual bool is_range_check_stub() const { return true; } 162 virtual void visit(LIR_OpVisitState* visitor) { 163 visitor->do_slow_case(_info); 164 visitor->do_input(_index); 165 if (_array) { visitor->do_input(_array); } 166 } 167 #ifndef PRODUCT 168 virtual void print_name(outputStream* out) const { out->print("RangeCheckStub"); } 169 #endif // PRODUCT 170 }; 171 172 // stub used when predicate fails and deoptimization is needed 173 class PredicateFailedStub: public CodeStub { 174 private: 175 CodeEmitInfo* _info; 176 177 public: |