package com.coderising.jvm.method;
import com.coderising.jvm.clz.ClassFile;
import com.coderising.jvm.attr.AttributeInfo;
import com.coderising.jvm.attr.CodeAttr;
import com.coderising.jvm.attr.InvalidAttributeInfoException;
import com.coderising.jvm.constant.ConstantPool;
import com.coderising.jvm.constant.UTF8Info;
import com.coderising.jvm.loader.ByteCodeIterator;
public class Method {
private int accessFlag;
private int nameIndex;
private int descriptorIndex;
private CodeAttr codeAttr;
private ClassFile clzFile;
public ClassFile getClzFile() {
return clzFile;
}
public int getNameIndex() {
return nameIndex;
}
public int getDescriptorIndex() {
return descriptorIndex;
}
public CodeAttr getCodeAttr() {
return codeAttr;
}
public void setCodeAttr(CodeAttr code) {
this.codeAttr = code;
}
public Method(ClassFile clzFile,int accessFlag, int nameIndex, int descriptorIndex) {
this.clzFile = clzFile;
this.accessFlag = accessFlag;
this.nameIndex = nameIndex;
this.descriptorIndex = descriptorIndex;
}
public static Method parse(ClassFile clzFile, ByteCodeIterator iter) throws InvalidMethodInfoException{
int accessFlagIndex = iter.getNextNBytesInteger(2);
int nameIndex = iter.getNextNBytesInteger(2);
int descriptorIndex = iter.getNextNBytesInteger(2);
int attributeCount = iter.getNextNBytesInteger(2);
System.out.println("access flag index: " + accessFlagIndex );
System.out.println("name Index: " + nameIndex + " name value: " + clzFile.getConstantPool().getUTF8String(nameIndex));
System.out.println("descriptor Index: " + descriptorIndex + " descriptor value: " + clzFile.getConstantPool().getUTF8String(descriptorIndex));
System.out.println("attributeCount: " + attributeCount );
Method m = new Method(clzFile, accessFlagIndex, nameIndex, descriptorIndex);
try{
AttributeInfo attr = AttributeInfo.parse(clzFile, iter);
if(attr instanceof CodeAttr){
System.out.println("set code attribute.");
m.setCodeAttr((CodeAttr)attr);
}
else{
throw new InvalidAttributeInfoException("unsupported attribute type. Current only CodeAttr supported");
}
}catch(Exception e){
e.printStackTrace();
}
return m;
}
@Override
public String toString() {
return "Method [accessFlag=" + accessFlag + ", nameIndex=" + nameIndex
+ " name val: " + clzFile.getConstantPool().getUTF8String(nameIndex) +", descriptorIndex=" + descriptorIndex +" desc val: " + clzFile.getConstantPool().getUTF8String(descriptorIndex) + "]";
}
}