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