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 LineNumberTable extends AttributeInfo {
private static String TYPE = LINE_NUM_TABLE;
private int lineNumberTableLength;
private List<LineNumberItem> lineNumberTable = new ArrayList<LineNumberTable.LineNumberItem>();
public LineNumberTable(int attrNameIndex, int attrLen,
int lineNumberTableLength) {
super(attrNameIndex, attrLen);
this.lineNumberTableLength = lineNumberTableLength;
}
public void addLineNumberItem(LineNumberItem e) {
this.lineNumberTable.add(e);
}
@Override
public String getType() {
return TYPE;
}
public static LineNumberTable parse(ConstantPool pool, ByteCodeIterator itr) {
int attrNameIndex = itr.nextU2toInt();
int attrLen = itr.nextU4toInt();
int lineNumberTableLength = itr.nextU2toInt();
LineNumberTable lineNumberTable = new LineNumberTable(attrNameIndex,
attrLen, lineNumberTableLength);
for (int i = 0; i < lineNumberTableLength; i++) {
lineNumberTable.addLineNumberItem(LineNumberItem.parse(pool, itr));
}
return lineNumberTable;
}
/**
*
* @author Meng
*
*/
private static class LineNumberItem {
@SuppressWarnings("unused")
private int startPc;
@SuppressWarnings("unused")
private int lineNum;
public LineNumberItem(int startPc, int lineNum) {
super();
this.startPc = startPc;
this.lineNum = lineNum;
}
public static LineNumberItem parse(ConstantPool pool,
ByteCodeIterator itr) {
int startPc = itr.nextU2toInt();
int lineNum = itr.nextU2toInt();
return new LineNumberTable.LineNumberItem(startPc, lineNum);
}
}
/*
* getter setter
*/
public int getLineNumberTableLength() {
return lineNumberTableLength;
}
public void setLineNumberTableLength(int lineNumberTableLength) {
this.lineNumberTableLength = lineNumberTableLength;
}
}