< prev index next >
src/hotspot/cpu/arm/templateTable_arm.cpp
Print this page
@@ -4198,38 +4198,46 @@
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);
- // do the call - the index is actually the method to call
+ // Get receiver klass into Rklass - also a null check
+ __ load_klass(Rklass, Rrecv);
- __ null_check(Rrecv, Rtemp);
+ 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);
- // 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,
< prev index next >