< prev index next >

src/hotspot/cpu/aarch64/templateTable_aarch64.cpp

Print this page

        

*** 3367,3392 **** // r0: interface klass (from f1) // rmethod: method (from f2) // r2: receiver // r3: flags // 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(r3, ConstantPoolCacheEntry::is_forced_virtual_shift, notMethod); invokevirtual_helper(rmethod, r2, r3); ! __ bind(notMethod); // Get receiver klass into r3 - also a null check __ restore_locals(); __ null_check(r2, oopDesc::klass_offset_in_bytes()); __ load_klass(r3, r2); ! Label no_such_interface, no_such_method; // Preserve method for throw_AbstractMethodErrorVerbose. __ mov(r16, rmethod); // Receiver subtype check against REFC. // Superklass in r0. Subklass in r3. Blows rscratch2, r13 --- 3367,3415 ---- // r0: interface klass (from f1) // rmethod: method (from f2) // r2: receiver // r3: flags + // First check for Object case, then private interface method, + // then regular interface method. + // Special case of invokeinterface called for virtual method of ! // java.lang.Object. See cpCache.cpp for details. ! Label notObjectMethod; ! __ tbz(r3, ConstantPoolCacheEntry::is_forced_virtual_shift, notObjectMethod); invokevirtual_helper(rmethod, r2, r3); ! __ bind(notObjectMethod); ! ! Label no_such_interface; ! ! // Check for private method invocation - indicated by vfinal ! Label notVFinal; ! __ tbz(r3, ConstantPoolCacheEntry::is_vfinal_shift, notVFinal); ! ! // Get receiver klass into r3 - also a null check ! __ null_check(r2, oopDesc::klass_offset_in_bytes()); ! __ load_klass(r3, r2); ! ! Label subtype; ! __ check_klass_subtype(r3, r0, r4, subtype); ! // If we get here the typecheck failed ! __ b(no_such_interface); ! __ bind(subtype); ! ! __ profile_final_call(r0); ! __ profile_arguments_type(r0, rmethod, r4, true); ! __ jump_from_interpreted(rmethod, r0); ! ! __ bind(notVFinal); // Get receiver klass into r3 - also a null check __ restore_locals(); __ null_check(r2, oopDesc::klass_offset_in_bytes()); __ load_klass(r3, r2); ! Label no_such_method; // Preserve method for throw_AbstractMethodErrorVerbose. __ mov(r16, rmethod); // Receiver subtype check against REFC. // Superklass in r0. Subklass in r3. Blows rscratch2, r13
< prev index next >