if(state==STATE_CREATED){
try{
state = STATE_LOADING;
String className = inputStream.readUTF();
if(!getName().equals(className))
throw new XRuntimeException("Wrong class name %s expect %s", getName(), className);
modifier = inputStream.readUnsignedShort();
if(getPackage() instanceof XClass){
XChecks.checkModifier(this, modifier, INNERMODIFIER);
}else if(getPackage() instanceof XMethod){
XChecks.checkModifier(this, modifier, INNERMODIFIER);
}else{
XChecks.checkModifier(this, modifier, OUTERMODIFIER);
}
annotations = new XAnnotation[inputStream.readUnsignedByte()];
for(int i=0; i<annotations.length; i++){
annotations[i] = new XAnnotation(inputStream);
}
int childCount = inputStream.readUnsignedByte();
for(int i=0; i<childCount; i++){
XClass xClass = new XClass(virtualMachine, inputStream.readUTF());
super.addChild(xClass);
xClass.load(inputStream);
}
superClasses = new XClassPtr[inputStream.readUnsignedByte()];
canBeDiamondExtender = new boolean[superClasses.length];
for(int i=0; i<superClasses.length; i++){
(superClasses[i] = XClassPtr.load(inputStream)).getXClassNonNull(virtualMachine);
canBeDiamondExtender[i] = true;
}
checkDiamonds(new HashMap<XClass, XClass>());
genericInfos = new XGenericInfo[inputStream.readUnsignedByte()];
for(int i=0; i<genericInfos.length; i++){
genericInfos[i] = new XGenericInfo(virtualMachine, inputStream);
}
fields = new XField[inputStream.readUnsignedShort()];
for(int i=0; i<fields.length; i++){
super.addChild(fields[i] = new XField(this, inputStream));
}
methods = new XMethod[inputStream.readUnsignedShort()];
for(int i=0; i<methods.length; i++){
super.addChild(methods[i] = new XMethod(this, inputStream));
if(methods[i].isConstructor() && !XModifier.isStatic(methods[i].getModifier())){
XClass[] superClasses = methods[i].getExplizitSuperInvokes();
for(int j=0; j<superClasses.length; j++){
for(int k=0; k<this.superClasses.length; k++){
if(superClasses[j] == this.superClasses[k].getXClassNonNull(virtualMachine)){
canBeDiamondExtender[k] = false;
break;
}
}
}
}
}
state = STATE_LOADED;
virtualMachine.getClassProvider().addClassForLoading(this);
}catch(Throwable e){
state = STATE_ERRORED;
if(!(e instanceof XRuntimeException)){
e = new XRuntimeException(e, "Error while loading class %s", getName());
}
throw (XRuntimeException)e;
}
}
}