package com.coderising.jvm.attr; import java.util.ArrayList; import java.util.List; import com.coderising.jvm.constant.ConstantPool; import com.coderising.jvm.loader.ByteCodeIterator; public class LocalVariableTable extends AttributeInfo { private static String TYPE = LOCAL_VAR_TABLE; private int localVarTableLength;// u2 local_variable_table_length private List<LocalVariableItem> itemList = new ArrayList<LocalVariableItem>(); public LocalVariableTable(int attrNameIndex, int attrLen, int localVarTableLength) { super(attrNameIndex, attrLen); this.localVarTableLength = localVarTableLength; } public void addItemList(LocalVariableItem item) { this.itemList.add(item); } @Override public String getType() { return TYPE; } public static LocalVariableTable parse(ConstantPool pool, ByteCodeIterator itr) { int attrNameIndex = itr.nextU2toInt(); int attrLen = itr.nextU4toInt(); int localVarTableLength = itr.nextU2toInt(); LocalVariableTable table = new LocalVariableTable(attrNameIndex, attrLen, localVarTableLength); for (int i = 0; i < localVarTableLength; i++) { table.addItemList(LocalVariableItem.parse(pool, itr)); } return table; } /** * inner class * * @author Meng * */ public static class LocalVariableItem { @SuppressWarnings("unused") private int startPc; @SuppressWarnings("unused") private int length; @SuppressWarnings("unused") private int nameIndex; @SuppressWarnings("unused") private int descriptorIndex; @SuppressWarnings("unused") private int index; public LocalVariableItem(int startPc, int length, int nameIndex, int descriptorIndex, int index) { super(); this.startPc = startPc; this.length = length; this.nameIndex = nameIndex; this.descriptorIndex = descriptorIndex; this.index = index; } public static LocalVariableItem parse(ConstantPool pool, ByteCodeIterator itr) { int startPc = itr.nextU2toInt(); int length = itr.nextU2toInt(); int nameIndex = itr.nextU2toInt(); int descriptorIndex = itr.nextU2toInt(); int index = itr.nextU2toInt(); LocalVariableItem item = new LocalVariableItem(startPc, length, nameIndex, descriptorIndex, index); return item; } } /* * getter setter */ public int getLocalVarTableLength() { return localVarTableLength; } public void setLocalVarTableLength(int localVarTableLength) { this.localVarTableLength = localVarTableLength; } }