// step 10 func initSucceeded(class *rtc.Class) { initCond := class.InitCond() initCond.L.Lock() defer initCond.L.Unlock() class.MarkFullyInitialized() class.InitCond().Broadcast() }
// see: jls8 12.4.2. Detailed Initialization Procedure // http://docs.oracle.com/javase/specs/jls/se8/html/jls-12.html#jls-12.4.2 func initClass(thread *Thread, class *rtc.Class) { // step 1 initCond := class.InitCond() initCond.L.Lock() // step 2 & 3 threadPtr := uintptr(unsafe.Pointer(thread)) isInitializing, initThreadPtr := class.IsBeingInitialized() if isInitializing { if initThreadPtr != threadPtr { initCond.Wait() } else { initCond.L.Unlock() return } } // step 4 if class.IsFullyInitialized() { initCond.L.Unlock() return } // step 5 if class.IsInitializationFailed() { initCond.L.Unlock() panic("NoClassDefFoundError") // todo } // step 6 class.MarkBeingInitialized(threadPtr) initCond.L.Unlock() initConstantStaticFields(class) // step 7 defer initSuperClass(thread, class) // step 8 // todo // step 9 & 10 callClinit(thread, class) // step 11 & 12 // todo }