if (loader.isCompileRequired()) { compileRuntime(0); }
	private synchronized VmType doPrepare() {		if (isPrepared()) {			return this;		}		if (isPreparing()) {			throw new Error("Recursive prepare in " + getName());		}		modifiers |= Modifier.ACC_PREPARING;		try {			// Step 1a: Load the super class			if ((superClass == null) && (superClassName != null)) {				setSuperClass((VmNormalClass) loader.loadClass(superClassName, false));			}			// Step 1b: Resolve the super class			if (superClass != null) {				superClass.prepare();				superClassDepth = superClass.getSuperClassDepth() + 1;			}			/**			 * Step 2a: Load the implemented interface classes (if any)			 */			final int cnt = getNoDeclaredInterfaces();			for (int i = 0; i < cnt; i++) {				final VmImplementedInterface intf = interfaceTable[i];				intf.resolve(loader);			}			// Now we're at the DEFINED state			modifiers |= Modifier.ACC_DEFINED;		} catch (ClassNotFoundException ex) {			modifiers |= Modifier.ACC_INVALID;			modifiers &= ~Modifier.ACC_PREPARING;			throw new NoClassDefFoundError(ex.getMessage());		}		// Step 3: Calculate the object size		// Step 4a: Fix the offset for all declared non-static fields		// Step 4b: Create the referenceOffsets field		prepareForInstantiation();		/* Build the allInterfaceTable */		final HashSet all = new HashSet();		getAllInterfaces(all, this);		this.allInterfaceTable = new VmInterfaceClass[all.size()];		all.toArray(allInterfaceTable);		// Step 5: Create the TIB		final Object[] tib = prepareTIB(all);		/* Build the interface method table */		if (all.size() > 0) {			final IMTBuilder imtBuilder = prepareIMT(all);			if (imtBuilder != null) {				tib[TIBLayout.IMT_INDEX] = imtBuilder.getImt();				tib[TIBLayout.IMTCOLLISIONS_INDEX] = imtBuilder.getImtCollisions();			}			// Look for Uninterruptible			final int length = all.size();			final String uninterruptibleName = Uninterruptible.class.getName();			for (int i = 0; i < length; i++) {				if (allInterfaceTable[i].getName().equals(uninterruptibleName)) {					final int mCount = getNoDeclaredMethods();					for (int m = 0; m < mCount; m++) {						getDeclaredMethod(m).setUninterruptible();					}					break;				}			}		}		/* Build the super classes array */		this.superClassesArray = createSuperClassesArray(all);		if (tib != null) {			tib[TIBLayout.SUPERCLASSES_INDEX] = superClassesArray;		}		/* If there is no static initializer, this class is initialized */		if (getMethod("<clinit>", "()V", true, false) == null) {			modifiers |= Modifier.ACC_INITIALIZED;		}		// Now we're in the PREPARED state		modifiers |= Modifier.ACC_PREPARED;		modifiers &= ~Modifier.ACC_PREPARING;		// Compile the methods with the least optimizing compiler		if (loader.isCompileRequired()) {			compileRuntime(0);		}		// Notify all threads that are waiting for me		notifyAll();		return this;	}