< prev index next >

src/hotspot/cpu/x86/templateTable_x86.cpp

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

*** 3870,3879 **** --- 3870,3881 ---- __ null_check(rcx, oopDesc::klass_offset_in_bytes()); __ load_klass(rdx, rcx); Label no_such_interface, no_such_method; + // Preserve method for throw_AbstractMethodErrorVerbose. + __ mov(rcx, rbx); // Receiver subtype check against REFC. // Superklass in rax. Subklass in rdx. Blows rcx, rdi. __ lookup_interface_method(// inputs: rec. class, interface, itable index rdx, rax, noreg, // outputs: scan temp. reg, scan temp. reg
*** 3891,3902 **** __ movptr(rax, Address(rax, ConstantPool::pool_holder_offset_in_bytes())); __ movl(rbx, Address(rbx, Method::itable_index_offset())); __ subl(rbx, Method::itable_index_max); __ negl(rbx); __ lookup_interface_method(// inputs: rec. class, interface, itable index ! rdx, rax, rbx, // outputs: method, scan temp. reg rbx, rbcp, no_such_interface); // rbx: Method* to call --- 3893,3906 ---- __ movptr(rax, Address(rax, ConstantPool::pool_holder_offset_in_bytes())); __ movl(rbx, Address(rbx, Method::itable_index_offset())); __ subl(rbx, Method::itable_index_max); __ negl(rbx); + // Preserve recvKlass for throw_AbstractMethodErrorVerbose. + __ mov(rlocals, rdx); __ lookup_interface_method(// inputs: rec. class, interface, itable index ! rlocals, rax, rbx, // outputs: method, scan temp. reg rbx, rbcp, no_such_interface); // rbx: Method* to call
*** 3924,3944 **** __ bind(no_such_method); // throw exception __ pop(rbx); // pop return address (pushed by prepare_invoke) __ restore_bcp(); // rbcp 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 __ pop(rbx); // pop return address (pushed by prepare_invoke) __ restore_bcp(); // rbcp 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(); } void TemplateTable::invokehandle(int byte_no) { --- 3928,3961 ---- __ bind(no_such_method); // throw exception __ pop(rbx); // pop return address (pushed by prepare_invoke) __ restore_bcp(); // rbcp 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. ! #ifdef _LP64 ! Register recvKlass = c_rarg1; ! Register method = c_rarg2; ! if (recvKlass != rdx) { __ movq(recvKlass, rdx); } ! if (method != rcx) { __ movq(method, rcx); } ! #else ! Register recvKlass = rdx; ! Register method = rcx; ! #endif ! __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::throw_AbstractMethodErrorVerbose), ! recvKlass, method); ! // The call_VM checks for exception, so we should never return here. __ should_not_reach_here(); __ bind(no_such_interface); // throw exception __ pop(rbx); // pop return address (pushed by prepare_invoke) __ restore_bcp(); // rbcp 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. ! LP64_ONLY( if (recvKlass != rdx) { __ movq(recvKlass, rdx); } ) ! __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::throw_IncompatibleClassChangeErrorVerbose), ! recvKlass, rax); // the call_VM checks for exception, so we should never return here. __ should_not_reach_here(); } void TemplateTable::invokehandle(int byte_no) {
< prev index next >