< prev index next >
src/hotspot/cpu/sparc/templateTable_sparc.cpp
Print this page
rev 50604 : imported patch jep181-rev1
*** 3200,3230 ****
const Register Rscratch = G4_scratch;
assert_different_registers(Rscratch, G5_method);
prepare_invoke(byte_no, Rinterface, Rret, Rmethod, O0_recv, O1_flags);
! // get receiver klass
__ null_check(O0_recv, oopDesc::klass_offset_in_bytes());
__ load_klass(O0_recv, O2_Klass);
// Special case of invokeinterface called for virtual method of
! // java.lang.Object. See cpCacheOop.cpp for details.
! // This code isn't produced by javac, but could be produced by
! // another compliant java compiler.
! Label notMethod;
__ set((1 << ConstantPoolCacheEntry::is_forced_virtual_shift), Rscratch);
__ btst(O1_flags, Rscratch);
! __ br(Assembler::zero, false, Assembler::pt, notMethod);
__ delayed()->nop();
invokeinterface_object_method(O2_Klass, Rinterface, Rret, O1_flags);
! __ bind(notMethod);
Register Rtemp = O1_flags;
! Label L_no_such_interface;
// Receiver subtype check against REFC.
__ lookup_interface_method(// inputs: rec. class, interface, itable index
O2_Klass, Rinterface, noreg,
// outputs: temp reg1, temp reg2, temp reg3
--- 3200,3258 ----
const Register Rscratch = G4_scratch;
assert_different_registers(Rscratch, G5_method);
prepare_invoke(byte_no, Rinterface, Rret, Rmethod, O0_recv, O1_flags);
! // First check for Object case, then private interface method,
! // then regular interface method.
!
! // get receiver klass - this is also a null check
__ null_check(O0_recv, oopDesc::klass_offset_in_bytes());
__ load_klass(O0_recv, O2_Klass);
// Special case of invokeinterface called for virtual method of
! // java.lang.Object. See cpCache.cpp for details.
! Label notObjectMethod;
__ set((1 << ConstantPoolCacheEntry::is_forced_virtual_shift), Rscratch);
__ btst(O1_flags, Rscratch);
! __ br(Assembler::zero, false, Assembler::pt, notObjectMethod);
__ delayed()->nop();
invokeinterface_object_method(O2_Klass, Rinterface, Rret, O1_flags);
! __ bind(notObjectMethod);
!
! Label L_no_such_interface;
!
! // Check for private method invocation - indicated by vfinal
! Label notVFinal;
! {
! __ set((1 << ConstantPoolCacheEntry::is_vfinal_shift), Rscratch);
! __ btst(O1_flags, Rscratch);
! __ br(Assembler::zero, false, Assembler::pt, notVFinal);
! __ delayed()->nop();
+ Label subtype;
Register Rtemp = O1_flags;
+ __ check_klass_subtype(O2_Klass, Rinterface, Rscratch, Rtemp, subtype);
+ // If we get here the typecheck failed
+ __ ba(L_no_such_interface);
+ __ delayed()->nop();
+ __ bind(subtype);
! // do the call
! Register Rcall = Rinterface;
! __ mov(Rmethod, G5_method);
! assert_different_registers(Rcall, G5_method, Gargs, Rret);
!
! __ profile_arguments_type(G5_method, Rcall, Gargs, true);
! __ profile_final_call(Rscratch);
! __ call_from_interpreter(Rcall, Gargs, Rret);
! }
! __ bind(notVFinal);
!
! Register Rtemp = O1_flags;
// Receiver subtype check against REFC.
__ lookup_interface_method(// inputs: rec. class, interface, itable index
O2_Klass, Rinterface, noreg,
// outputs: temp reg1, temp reg2, temp reg3
< prev index next >