package org.tinylcy.attributeinfo;
import org.tinylcy.basictype.U2;
import org.tinylcy.basictype.U4;
import org.tinylcy.constantpool.ConstantPool;
import org.tinylcy.constantpool.ConstantUtf8Info;
import java.io.InputStream;
import java.util.Arrays;
/**
* Created by chenyangli.
*/
public class LineNumberTable extends BasicAttributeInfo {
private short lineNumberTableLength;
private LineNumberInfo[] lineNumberTable;
public LineNumberTable(ConstantPool constantPool, short attributeNameIndex) {
super(constantPool);
setAttributeNameIndex(attributeNameIndex);
}
@Override
public void read(InputStream inputStream) {
U4 attributeLengthU4 = U4.read(inputStream);
U2 lineNumberTableLengthU2 = U2.read(inputStream);
setAttributeLength(attributeLengthU4.getValue());
lineNumberTableLength = lineNumberTableLengthU2.getValue();
lineNumberTable = new LineNumberInfo[lineNumberTableLength];
for (int i = 0; i < lineNumberTableLength; i++) {
LineNumberInfo lineNumberInfo = new LineNumberInfo();
lineNumberInfo.read(inputStream);
lineNumberTable[i] = lineNumberInfo;
}
}
@Override
public String toString() {
return "LineNumberTable{" +
"attributeNameIndex=" + getAttributeNameIndex() +
" [attribute name = " + ((ConstantUtf8Info) (constantPool.getCpInfo()[getAttributeNameIndex() - 1])).getValue() + "]" +
", attributeLength=" + getAttributeLength() +
", lineNumberTableLength=" + lineNumberTableLength +
", lineNumberTable=" + Arrays.toString(lineNumberTable) +
'}';
}
private class LineNumberInfo {
public short startPc;
public short lineNumber;
public void read(InputStream inputStream) {
U2 startPcU2 = U2.read(inputStream);
U2 lineNumberU2 = U2.read(inputStream);
startPc = startPcU2.getValue();
lineNumber = lineNumberU2.getValue();
}
@Override
public String toString() {
return "LineNumberInfo{" +
"startPc=" + startPc +
", lineNumber=" + lineNumber +
'}';
}
}
}