< 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,10 +3438,12 @@
__ 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,12 +3460,14 @@
__ 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
- r3, r0, rmethod,
+ rlocals, r0, rmethod,
// outputs: method, scan temp. reg
rmethod, r13,
no_such_interface);
// rmethod,: methodOop to call
@@ -3488,20 +3492,22 @@
__ 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));
+ // 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_IncompatibleClassChangeError));
+ 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 >