package com.coderising.jvm.attr;
import com.coderising.jvm.clz.ClassFile;
import com.coderising.jvm.constant.ConstantPool;
import com.coderising.jvm.loader.ByteCodeIterator;
public abstract class AttributeInfo {
public static final String CODE = "Code";
public static final String CONST_VALUE = "ConstantValue";
public static final String EXCEPTIONS = "Exceptions";
public static final String LINE_NUM_TABLE = "LineNumberTable";
public static final String LOCAL_VAR_TABLE = "LocalVariableTable";
public static final String STACK_MAP_TABLE = "StackMapTable";
int attrNameIndex;
int attrLen ;
public AttributeInfo(int attrNameIndex, int attrLen) {
this.attrNameIndex = attrNameIndex;
this.attrLen = attrLen;
}
public static AttributeInfo parse(ClassFile file, ByteCodeIterator iter) throws InvalidAttributeInfoException{
AttributeInfo attrInfo = null;
int attributeType = iter.getNextNBytesInteger(2);
String attributeTag = file.getConstantPool().getUTF8String(attributeType);
System.out.println("attribute type: " + attributeType + " utf8 val: " + file.getConstantPool().getUTF8String(attributeType));
if(attributeTag.equals(CODE)){
System.out.println("about to parse CODE attribute");
//ClassFile clzFile, ByteCodeIterator iter, int attributeNameIndex
attrInfo = CodeAttr.parse(file, iter, attributeType);
}
else if(attributeTag.equals(LINE_NUM_TABLE)){
System.out.println("about to parse LINE_NUM_TABLE attribute");
attrInfo = LineNumberTable.parse(iter);
}
else if(attributeTag.equals(LOCAL_VAR_TABLE)){
System.out.println("about to parse LOCAL_VAR_TABLE attribute");
attrInfo = LocalVariableTable.parse(iter, file, attributeType);
}
else{
System.out.println("about to throw attribute");
throw new InvalidAttributeInfoException("Unimplemented attribute exception.");
}
return attrInfo;
}
}