< prev index next >

src/hotspot/cpu/arm/templateTable_arm.cpp

Print this page

        

*** 4198,4235 **** const Register Rflags = R3_tmp; const Register Rklass = R3_tmp; prepare_invoke(byte_no, Rinterf, Rmethod, Rrecv, Rflags); // Check for private method invocation - indicated by vfinal Label notVFinal; __ tbz(flags, ConstantPoolCacheEntry::is_vfinal_shift, notVFinal); ! // do the call - the index is actually the method to call ! __ null_check(Rrecv, Rtemp); __ profile_final_call(R0_tmp); __ jump_from_interpreted(Rindex); __ bind(notVFinal); // 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; __ tbz(Rflags, ConstantPoolCacheEntry::is_forced_virtual_shift, notMethod); invokevirtual_helper(Rmethod, Rrecv, Rflags); __ bind(notMethod); - // Get receiver klass into Rklass - also a null check - __ load_klass(Rklass, Rrecv); - - Label no_such_interface; - // Receiver subtype check against REFC. __ lookup_interface_method(// inputs: rec. class, interface Rklass, Rinterf, noreg, // outputs: scan temp. reg1, scan temp. reg2 noreg, Ritable, Rtemp, --- 4198,4243 ---- const Register Rflags = R3_tmp; const Register Rklass = R3_tmp; prepare_invoke(byte_no, Rinterf, Rmethod, Rrecv, Rflags); + + Label no_such_interface; + // Check for private method invocation - indicated by vfinal Label notVFinal; __ tbz(flags, ConstantPoolCacheEntry::is_vfinal_shift, notVFinal); ! // Get receiver klass into Rklass - also a null check ! __ load_klass(Rklass, Rrecv); ! Label subtype; ! __ check_klass_subtype(Rklass, Rinterf, R1_tmp, R0_tmp, subtype); ! // If we get here the typecheck failed ! __ b(no_such_interface); ! __ bind(subtype); ! ! // do the call - the index is actually the method to call __ profile_final_call(R0_tmp); __ jump_from_interpreted(Rindex); __ bind(notVFinal); + // Get receiver klass into Rklass - also a null check + __ load_klass(Rklass, Rrecv); + // 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; __ tbz(Rflags, ConstantPoolCacheEntry::is_forced_virtual_shift, notMethod); invokevirtual_helper(Rmethod, Rrecv, Rflags); __ bind(notMethod); // Receiver subtype check against REFC. __ lookup_interface_method(// inputs: rec. class, interface Rklass, Rinterf, noreg, // outputs: scan temp. reg1, scan temp. reg2 noreg, Ritable, Rtemp,
< prev index next >