< prev index next >

src/hotspot/cpu/sparc/interp_masm_sparc.cpp

Print this page
rev 49887 : 8201593: Print array length in ArrayIndexOutOfBoundsException.
Reviewed-by: dholmes, mdoerr

*** 877,907 **** void InterpreterMacroAssembler::index_check_without_pop(Register array, Register index, int index_shift, Register tmp, Register res) { assert_not_delayed(); verify_oop(array); ! // sign extend since tos (index) can be a 32bit value sra(index, G0, index); ! // check array Label ptr_ok; tst(array); ! throw_if_not_1_x( notZero, ptr_ok ); ! delayed()->ld( array, arrayOopDesc::length_offset_in_bytes(), tmp ); // check index ! throw_if_not_2( Interpreter::_throw_NullPointerException_entry, G3_scratch, ptr_ok); Label index_ok; cmp(index, tmp); ! throw_if_not_1_icc( lessUnsigned, index_ok ); ! if (index_shift > 0) delayed()->sll(index, index_shift, index); ! else delayed()->add(array, index, res); // addr - const offset in index ! // convention: move aberrant index into G3_scratch for exception message ! mov(index, G3_scratch); ! throw_if_not_2( Interpreter::_throw_ArrayIndexOutOfBoundsException_entry, G4_scratch, index_ok); // add offset if didn't do it in delay slot ! if (index_shift > 0) add(array, index, res); // addr - const offset in index } void InterpreterMacroAssembler::index_check(Register array, Register index, int index_shift, Register tmp, Register res) { assert_not_delayed(); --- 877,912 ---- void InterpreterMacroAssembler::index_check_without_pop(Register array, Register index, int index_shift, Register tmp, Register res) { assert_not_delayed(); verify_oop(array); ! // Sign extend since tos (index) can be a 32bit value. sra(index, G0, index); ! // Check array. Label ptr_ok; tst(array); ! throw_if_not_1_x(notZero, ptr_ok); ! delayed()->ld(array, arrayOopDesc::length_offset_in_bytes(), tmp); // Check index. ! throw_if_not_2(Interpreter::_throw_NullPointerException_entry, G3_scratch, ptr_ok); Label index_ok; cmp(index, tmp); ! throw_if_not_1_icc(lessUnsigned, index_ok); ! if (index_shift > 0) { ! delayed()->sll(index, index_shift, index); ! } else { ! delayed()->add(array, index, res); // addr - const offset in index ! } ! // Pass the array to create more detailed exceptions. ! // Convention: move aberrant index into Otos_i for exception message. ! mov(index, Otos_i); ! mov(array, G3_scratch); ! throw_if_not_2(Interpreter::_throw_ArrayIndexOutOfBoundsException_entry, G4_scratch, index_ok); // add offset if didn't do it in delay slot ! if (index_shift > 0) { add(array, index, res); } // addr - const offset in index } void InterpreterMacroAssembler::index_check(Register array, Register index, int index_shift, Register tmp, Register res) { assert_not_delayed();
< prev index next >