diff -r 10041d61f50c -r 3b0d5f4e1e30 src/hotspot/share/oops/cpCache.cpp --- a/src/hotspot/share/oops/cpCache.cpp Thu Nov 16 12:03:42 2017 -0500 +++ b/src/hotspot/share/oops/cpCache.cpp Tue Dec 05 09:59:36 2017 -0500 @@ -248,14 +248,13 @@ // virtual method in java.lang.Object. This is a corner case in the spec // but is presumably legal. javac does not generate this code. // - // We set bytecode_1() to _invokeinterface, because that is the - // bytecode # used by the interpreter to see if it is resolved. + // We do not set bytecode_1() to _invokeinterface, because that is the + // bytecode # used by the interpreter to see if it is resolved. In this + // case, the method gets reresolved with caller for each interface call + // because the actual selected method may not be public. + // // We set bytecode_2() to _invokevirtual. // See also interpreterRuntime.cpp. (8/25/2000) - // Only set resolved for the invokeinterface case if method is public. - // Otherwise, the method needs to be reresolved with caller for each - // interface call. - if (method->is_public()) set_bytecode_1(invoke_code); } else { assert(invoke_code == Bytecodes::_invokevirtual, ""); }