< prev index next >

src/hotspot/cpu/aarch64/templateTable_aarch64.cpp

Print this page
rev 49172 : 8197405: Improve messages of AbstractMethodErrors and IncompatibleClassChangeErrors.
Reviewed-by: coleenp, dholmes, mdoerr, njian

*** 3438,3447 **** --- 3438,3449 ---- __ null_check(r2, oopDesc::klass_offset_in_bytes()); __ load_klass(r3, r2); Label no_such_interface, no_such_method; + // Preserve method for throw_AbstractMethodErrorVerbose. + __ mov(r16, rmethod); // Receiver subtype check against REFC. // Superklass in r0. Subklass in r3. Blows rscratch2, r13 __ lookup_interface_method(// inputs: rec. class, interface, itable index r3, r0, noreg, // outputs: scan temp. reg, scan temp. reg
*** 3458,3469 **** __ ldr(r0, Address(r0, ConstantPool::pool_holder_offset_in_bytes())); __ ldrw(rmethod, Address(rmethod, Method::itable_index_offset())); __ subw(rmethod, rmethod, Method::itable_index_max); __ negw(rmethod, rmethod); __ lookup_interface_method(// inputs: rec. class, interface, itable index ! r3, r0, rmethod, // outputs: method, scan temp. reg rmethod, r13, no_such_interface); // rmethod,: methodOop to call --- 3460,3473 ---- __ ldr(r0, Address(r0, ConstantPool::pool_holder_offset_in_bytes())); __ ldrw(rmethod, Address(rmethod, Method::itable_index_offset())); __ subw(rmethod, rmethod, Method::itable_index_max); __ negw(rmethod, rmethod); + // Preserve recvKlass for throw_AbstractMethodErrorVerbose. + __ mov(rlocals, r3); __ lookup_interface_method(// inputs: rec. class, interface, itable index ! rlocals, r0, rmethod, // outputs: method, scan temp. reg rmethod, r13, no_such_interface); // rmethod,: methodOop to call
*** 3488,3507 **** __ bind(no_such_method); // throw exception __ restore_bcp(); // bcp must be correct for exception handler (was destroyed) __ restore_locals(); // make sure locals pointer is correct as well (was destroyed) ! __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::throw_AbstractMethodError)); // the call_VM checks for exception, so we should never return here. __ should_not_reach_here(); __ bind(no_such_interface); // throw exception __ restore_bcp(); // bcp must be correct for exception handler (was destroyed) __ restore_locals(); // make sure locals pointer is correct as well (was destroyed) __ call_VM(noreg, CAST_FROM_FN_PTR(address, ! InterpreterRuntime::throw_IncompatibleClassChangeError)); // the call_VM checks for exception, so we should never return here. __ should_not_reach_here(); return; } --- 3492,3513 ---- __ bind(no_such_method); // throw exception __ restore_bcp(); // bcp must be correct for exception handler (was destroyed) __ restore_locals(); // make sure locals pointer is correct as well (was destroyed) ! // Pass arguments for generating a verbose error message. ! __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::throw_AbstractMethodErrorVerbose), r3, r16); // the call_VM checks for exception, so we should never return here. __ should_not_reach_here(); __ bind(no_such_interface); // throw exception __ restore_bcp(); // bcp must be correct for exception handler (was destroyed) __ restore_locals(); // make sure locals pointer is correct as well (was destroyed) + // Pass arguments for generating a verbose error message. __ call_VM(noreg, CAST_FROM_FN_PTR(address, ! InterpreterRuntime::throw_IncompatibleClassChangeErrorVerbose), r3, r0); // the call_VM checks for exception, so we should never return here. __ should_not_reach_here(); return; }
< prev index next >