package week567_miniJVM.attr; import week567_miniJVM.clz.ClassFile; import week567_miniJVM.constant.ConstantInfo; import week567_miniJVM.constant.UTF8Info; import week567_miniJVM.loader.ByteCodeIterator; import week567_miniJVM.attr.LineNumberTable; public class AttrFactory{ private static AttrFactory instance = new AttrFactory(); public static AttrFactory Instance(){ return instance; } public AttributeInfo parse(ClassFile clzFile,ByteCodeIterator iter){ int attrNameIndex = iter.nextU2ToInt(); ConstantInfo info = clzFile.getConstantPool().getConstantInfo(attrNameIndex); if(info.getType()==1&&"Code".equals(((UTF8Info) info).getValue())){ int attrLen = iter.nextU4ToInt(); int maxStack = iter.nextU2ToInt(); int maxLocal = iter.nextU2ToInt(); int codeLen = iter.nextU4ToInt(); String code = iter.nextUxToHexString(codeLen); CodeAttr codeattr = new CodeAttr(attrNameIndex,attrLen,maxStack,maxLocal,codeLen,code); int exceptLen = iter.nextU2ToInt(); // �쳣���� while(exceptLen>0){ exceptLen -= 1; int startPc = iter.nextU2ToInt(); int endPc = iter.nextU2ToInt(); int handlerPc = iter.nextU2ToInt(); int catchType = iter.nextU2ToInt(); // TODO } int attributeLen = iter.nextU2ToInt(); // �����»������Եĸ��� while(attributeLen>0){ attributeLen -= 1; AttributeInfo chattr = AttrFactory.Instance().parse(clzFile, iter); codeattr.addAttr(chattr); } return codeattr; }else if(info.getType()==1&&"LineNumberTable".equals(((UTF8Info) info).getValue())){ int attrLen = iter.nextU4ToInt(); int lineNum = iter.nextU2ToInt(); LineNumberTable linetable = new LineNumberTable(attrNameIndex,lineNum); while(lineNum>0){ lineNum -= 1; int startPc = iter.nextU2ToInt(); int lineNumber = iter.nextU2ToInt(); linetable.addLineNumberItem(startPc,lineNumber); } return linetable; }else if(info.getType()==1&&"LocalVariableTable".equals(((UTF8Info) info).getValue())){ int attrLen = iter.nextU4ToInt(); int localVarNum = iter.nextU2ToInt(); LocalVariableTable lvartable = new LocalVariableTable(attrNameIndex,localVarNum); while(localVarNum>0){ localVarNum -= 1; int startPc = iter.nextU2ToInt(); int length = iter.nextU2ToInt(); int nameIndex = iter.nextU2ToInt(); int descIndex = iter.nextU2ToInt(); int index = iter.nextU2ToInt(); LocalVariableItem item = new LocalVariableItem(startPc,length,nameIndex,descIndex,index); lvartable.addLocalVariableItem(item); } return lvartable; }else if(info.getType()==1&&"StackMapTable".equals(((UTF8Info) info).getValue())){ int attrLen = iter.nextU4ToInt(); int entryNum = iter.nextU2ToInt(); StackMapTable stacktable = new StackMapTable(attrNameIndex,entryNum); stacktable.parse(iter); //while(entryNum>0){ // entryNum -= 1; //} return stacktable; } return null; } }