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", |