package jvm.classfile.attribute.parser.impl;
import jvm.classfile.attribute.item.AttributeInfo;
import jvm.classfile.attribute.parser.AttributeParser;
import jvm.classfile.attribute.item.impl.CodeAttr;
import jvm.classfile.attribute.parser.AttributeInfoParser;
import jvm.classfile.ConstantPool;
import jvm.util.ByteCodeIterator;
import java.util.ArrayList;
import java.util.List;
/**
* Created by Haochen on 2017/4/13.
* TODO:
*/
public class CodeParser implements AttributeInfoParser {
@Override
public AttributeInfo parse(int attrNameIndex, int attrLen,
ByteCodeIterator iterator, ConstantPool constantPool) {
int maxStack = iterator.nextU2ToInt();
int maxLocals = iterator.nextU2ToInt();
int codeLen = iterator.nextU4ToInt();
String code = iterator.nextHexString(codeLen);
int exceptionTableLen = iterator.nextU2ToInt();
iterator.skip(exceptionTableLen * 8);
int attrCount = iterator.nextU2ToInt();
List<AttributeInfo> attributes = new ArrayList<>();
for (int i = 0; i < attrCount; ++i) {
attributes.add(AttributeParser.parse(iterator, constantPool));
}
return new CodeAttr(attrNameIndex, attrLen, maxStack, maxLocals, codeLen, code, attributes);
}
}