< prev index next >

src/hotspot/cpu/s390/templateTable_s390.cpp

Print this page

        

@@ -3616,15 +3616,25 @@
                  receiver, flags);
 
   // Z_R14 (== Z_bytecode) : return entry
 
   // Check for private method invocation - indicated by vfinal
-  Label notVFinal;
+  NearLabel notVFinal;
   __ testbit(flags, ConstantPoolCacheEntry::is_vfinal_shift);
   __ z_brz(notVFinal);
 
-  __ null_check(receiver);
+  // Get receiver klass into klass - also a null check.
+  __ load_klass(klass, receiver);
+
+  NearLabel subtype, no_such_interface;
+
+  __ check_klass_subtype(klass, interface, Z_tmp_2, Z_temp_3, subtype);
+  // If we get here the typecheck failed
+  __ z_bru(no_such_interface);
+  __ bind(subtype);
+
+  // do the call
 
   __ profile_final_call(Z_tmp_2);
   __ profile_arguments_type(Z_tmp_2, method, Z_ARG5, true);
   __ jump_from_interpreted(method, Z_tmp_2);
 

@@ -3632,11 +3642,11 @@
 
   // 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.
-  NearLabel notMethod, no_such_interface, no_such_method;
+  NearLabel notMethod, no_such_method;
   __ testbit(flags, ConstantPoolCacheEntry::is_forced_virtual_shift);
   __ z_brz(notMethod);
   invokevirtual_helper(method, receiver, flags);
   __ bind(notMethod);
 
< prev index next >