< prev index next >

src/hotspot/cpu/s390/templateTable_s390.cpp

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


3725   // interpreter entry point and a conditional jump to it in case of a null
3726   // method.
3727   __ compareU64_and_branch(method2, (intptr_t) 0,
3728                             Assembler::bcondZero, no_such_method);
3729 
3730   __ profile_arguments_type(Z_tmp_1, method2, Z_tmp_2, true);
3731 
3732   // Do the call.
3733   __ jump_from_interpreted(method2, Z_tmp_2);
3734   __ should_not_reach_here();
3735 
3736   // exception handling code follows...
3737   // Note: Must restore interpreter registers to canonical
3738   // state for exception handling to work correctly!
3739 
3740   __ bind(no_such_method);
3741 
3742   // Throw exception.
3743   __ restore_bcp();      // Bcp must be correct for exception handler   (was destroyed).
3744   __ restore_locals();   // Make sure locals pointer is correct as well (was destroyed).


3745   __ call_VM(noreg,
3746              CAST_FROM_FN_PTR(address, InterpreterRuntime::throw_AbstractMethodError));


3747   // The call_VM checks for exception, so we should never return here.
3748   __ should_not_reach_here();
3749 
3750   __ bind(no_such_interface);
3751 
3752   // Throw exception.
3753   __ restore_bcp();      // Bcp must be correct for exception handler   (was destroyed).
3754   __ restore_locals();   // Make sure locals pointer is correct as well (was destroyed).

3755   __ call_VM(noreg,
3756              CAST_FROM_FN_PTR(address, InterpreterRuntime::throw_IncompatibleClassChangeError));


3757   // The call_VM checks for exception, so we should never return here.
3758   __ should_not_reach_here();
3759 
3760   BLOCK_COMMENT("} invokeinterface");
3761   return;
3762 }
3763 
3764 void TemplateTable::invokehandle(int byte_no) {
3765   transition(vtos, vtos);
3766 
3767   const Register method = Z_tmp_2;
3768   const Register recv   = Z_ARG5;
3769   const Register mtype  = Z_tmp_1;
3770   prepare_invoke(byte_no,
3771                  method, mtype,   // Get f2 method, f1 MethodType.
3772                  recv);
3773   __ verify_method_ptr(method);
3774   __ verify_oop(recv);
3775   __ null_check(recv);
3776 




3725   // interpreter entry point and a conditional jump to it in case of a null
3726   // method.
3727   __ compareU64_and_branch(method2, (intptr_t) 0,
3728                             Assembler::bcondZero, no_such_method);
3729 
3730   __ profile_arguments_type(Z_tmp_1, method2, Z_tmp_2, true);
3731 
3732   // Do the call.
3733   __ jump_from_interpreted(method2, Z_tmp_2);
3734   __ should_not_reach_here();
3735 
3736   // exception handling code follows...
3737   // Note: Must restore interpreter registers to canonical
3738   // state for exception handling to work correctly!
3739 
3740   __ bind(no_such_method);
3741 
3742   // Throw exception.
3743   __ restore_bcp();      // Bcp must be correct for exception handler   (was destroyed).
3744   __ restore_locals();   // Make sure locals pointer is correct as well (was destroyed).
3745   // Pass arguments for generating a verbose error message.
3746   __ z_lgr(Z_tmp_1, method); // Prevent register clash.
3747   __ call_VM(noreg,
3748              CAST_FROM_FN_PTR(address,
3749                               InterpreterRuntime::throw_AbstractMethodErrorVerbose),
3750                               klass, Z_tmp_1);
3751   // The call_VM checks for exception, so we should never return here.
3752   __ should_not_reach_here();
3753 
3754   __ bind(no_such_interface);
3755 
3756   // Throw exception.
3757   __ restore_bcp();      // Bcp must be correct for exception handler   (was destroyed).
3758   __ restore_locals();   // Make sure locals pointer is correct as well (was destroyed).
3759   // Pass arguments for generating a verbose error message.
3760   __ call_VM(noreg,
3761              CAST_FROM_FN_PTR(address,
3762                               InterpreterRuntime::throw_IncompatibleClassChangeErrorVerbose),
3763                               klass, interface);
3764   // The call_VM checks for exception, so we should never return here.
3765   __ should_not_reach_here();
3766 
3767   BLOCK_COMMENT("} invokeinterface");
3768   return;
3769 }
3770 
3771 void TemplateTable::invokehandle(int byte_no) {
3772   transition(vtos, vtos);
3773 
3774   const Register method = Z_tmp_2;
3775   const Register recv   = Z_ARG5;
3776   const Register mtype  = Z_tmp_1;
3777   prepare_invoke(byte_no,
3778                  method, mtype,   // Get f2 method, f1 MethodType.
3779                  recv);
3780   __ verify_method_ptr(method);
3781   __ verify_oop(recv);
3782   __ null_check(recv);
3783 


< prev index next >