8190478: Improved interface method selection

Reviewed-by: acorn, ahgross, jwilhelm, rhalade
This commit is contained in:
Harold Seigel 2017-12-05 09:59:36 -05:00 committed by Harold Seigel
parent 7c7422301e
commit a7c9c021ba

View File

@ -248,14 +248,13 @@ void ConstantPoolCacheEntry::set_direct_or_vtable_call(Bytecodes::Code invoke_co
// 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, "");
}