< prev index next >
src/hotspot/share/oops/cpCache.cpp
Print this page
*** 260,277 ****
// is executed.
if (invoke_code == Bytecodes::_invokespecial && sender_is_interface &&
method->name() != vmSymbols::object_initializer_name()) {
do_resolve = false;
}
// Don't mark invokestatic to method as resolved if the holder class has not yet completed
// initialization. An invokestatic must only proceed if the class is initialized, but if
! // we resolve it before then that class initialization check is skipped. However if the call
! // is from the same class we can resolve as we must be executing with <clinit> on our call stack.
! if (invoke_code == Bytecodes::_invokestatic) {
! if (!method->method_holder()->is_initialized() &&
! method->method_holder() != pool_holder) {
do_resolve = false;
} else {
assert(method->method_holder()->is_initialized() ||
method->method_holder()->is_reentrant_initialization(Thread::current()),
"invalid class initialization state for invoke_static");
}
--- 260,280 ----
// is executed.
if (invoke_code == Bytecodes::_invokespecial && sender_is_interface &&
method->name() != vmSymbols::object_initializer_name()) {
do_resolve = false;
}
+ if (invoke_code == Bytecodes::_invokestatic) {
+ if (method->needs_clinit_barrier()) {
+ if (UseFastClassInitChecks) {
+ // Template interpreter supports fast class initialization check for invokestatic which
+ // doesn't require unresolved call site.
+ } else {
// Don't mark invokestatic to method as resolved if the holder class has not yet completed
// initialization. An invokestatic must only proceed if the class is initialized, but if
! // we resolve it before then that class initialization check is skipped.
do_resolve = false;
+ }
} else {
assert(method->method_holder()->is_initialized() ||
method->method_holder()->is_reentrant_initialization(Thread::current()),
"invalid class initialization state for invoke_static");
}
< prev index next >