src/hotspot/cpu/x86/vtableStubs_x86_64.cpp
changeset 49368 2ed1c37df3a5
parent 48557 2e867226b914
child 51618 54b344d9dd4e
equal deleted inserted replaced
49366:f95ef5511e1f 49368:2ed1c37df3a5
   180 
   180 
   181   // Get selected method from declaring class and itable index
   181   // Get selected method from declaring class and itable index
   182   const Register method = rbx;
   182   const Register method = rbx;
   183   __ load_klass(recv_klass_reg, j_rarg0);   // restore recv_klass_reg
   183   __ load_klass(recv_klass_reg, j_rarg0);   // restore recv_klass_reg
   184   __ lookup_interface_method(// inputs: rec. class, interface, itable index
   184   __ lookup_interface_method(// inputs: rec. class, interface, itable index
   185                        recv_klass_reg, holder_klass_reg, itable_index,
   185                              recv_klass_reg, holder_klass_reg, itable_index,
   186                        // outputs: method, scan temp. reg
   186                              // outputs: method, scan temp. reg
   187                        method, temp_reg,
   187                              method, temp_reg,
   188                        L_no_such_interface);
   188                              L_no_such_interface);
   189 
   189 
   190   // If we take a trap while this arg is on the stack we will not
   190   // If we take a trap while this arg is on the stack we will not
   191   // be able to walk the stack properly. This is not an issue except
   191   // be able to walk the stack properly. This is not an issue except
   192   // when there are mistakes in this assembly code that could generate
   192   // when there are mistakes in this assembly code that could generate
   193   // a spurious fault. Ask me how I know...
   193   // a spurious fault. Ask me how I know...
   211   // j_rarg0: receiver
   211   // j_rarg0: receiver
   212   address ame_addr = __ pc();
   212   address ame_addr = __ pc();
   213   __ jmp(Address(method, Method::from_compiled_offset()));
   213   __ jmp(Address(method, Method::from_compiled_offset()));
   214 
   214 
   215   __ bind(L_no_such_interface);
   215   __ bind(L_no_such_interface);
   216   __ jump(RuntimeAddress(StubRoutines::throw_IncompatibleClassChangeError_entry()));
   216   // Handle IncompatibleClassChangeError in itable stubs.
       
   217   // More detailed error message.
       
   218   // We force resolving of the call site by jumping to the "handle
       
   219   // wrong method" stub, and so let the interpreter runtime do all the
       
   220   // dirty work.
       
   221   __ jump(RuntimeAddress(SharedRuntime::get_handle_wrong_method_stub()));
   217 
   222 
   218   __ flush();
   223   __ flush();
   219 
   224 
   220   if (PrintMiscellaneous && (WizardMode || Verbose)) {
   225   if (PrintMiscellaneous && (WizardMode || Verbose)) {
   221     tty->print_cr("itable #%d at " PTR_FORMAT "[%d] left over: %d",
   226     tty->print_cr("itable #%d at " PTR_FORMAT "[%d] left over: %d",