package com.coding.basic.homework_04.jvm.method; import com.coding.basic.homework_04.jvm.attr.AttributeInfo; import com.coding.basic.homework_04.jvm.attr.CodeAttr; import com.coding.basic.homework_04.jvm.clz.ClassFile; import com.coding.basic.homework_04.jvm.cmd.ByteCodeCommand; import com.coding.basic.homework_04.jvm.util.ByteCodeIterator; public class Method { private int accessFlag; private int nameIndex; private int descriptorIndex; private CodeAttr codeAttr; private ClassFile clzFile; public int getAccessFlag() { return accessFlag; } public void setAccessFlag(int accessFlag) { this.accessFlag = accessFlag; } public int getNameIndex() { return nameIndex; } public void setNameIndex(int nameIndex) { this.nameIndex = nameIndex; } public int getDescriptorIndex() { return descriptorIndex; } public void setDescriptorIndex(int descriptorIndex) { this.descriptorIndex = descriptorIndex; } public CodeAttr getCodeAttr() { return codeAttr; } public void setCodeAttr(CodeAttr codeAttr) { this.codeAttr = codeAttr; } private Method(int accessFlag, int nameIndex, int descriptorIndex, ClassFile clzFile){ this.accessFlag = accessFlag; this.nameIndex = nameIndex; this.descriptorIndex = descriptorIndex; this.clzFile = clzFile; } public static Method parse(ClassFile clzFile, ByteCodeIterator iterator) { int accessFlag = iterator.nextU2ToInt(); int nameIndex = iterator.nextU2ToInt(); int descriptorIndex = iterator.nextU2ToInt(); Method method = new Method(accessFlag, nameIndex, descriptorIndex, clzFile); int attributeCount = iterator.nextU2ToInt(); if(attributeCount > 0){ int attrNameIndex = iterator.nextU2ToInt(); String attrName = clzFile.getConstantPool().getUTF8String(attrNameIndex); if(AttributeInfo.CODE.equals(attrName)){ iterator.back(2); CodeAttr codeAttr = CodeAttr.parse(clzFile, iterator); method.setCodeAttr(codeAttr); } } return method; } public ByteCodeCommand[] getCmds() { return this.getCodeAttr().getCmds(); } }