< 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 >