1 package mockit.asm.methods;
2
3 import edu.umd.cs.findbugs.annotations.NonNull;
4 import edu.umd.cs.findbugs.annotations.Nullable;
5
6 import mockit.asm.constantPool.AttributeWriter;
7 import mockit.asm.constantPool.ConstantPoolGeneration;
8 import mockit.asm.controlFlow.Label;
9 import mockit.asm.util.ByteVector;
10
11 import org.checkerframework.checker.index.qual.NonNegative;
12
13
14
15
16 final class LineNumberTableWriter extends AttributeWriter {
17
18
19
20 @NonNegative
21 private int lineNumberCount;
22
23
24
25
26 @Nullable
27 private ByteVector lineNumbers;
28
29 LineNumberTableWriter(@NonNull ConstantPoolGeneration cp) {
30 super(cp);
31 }
32
33 void addLineNumber(@NonNegative int line, @NonNull Label start) {
34 if (lineNumbers == null) {
35 setAttribute("LineNumberTable");
36 lineNumbers = new ByteVector();
37 }
38
39 lineNumberCount++;
40 lineNumbers.putShort(start.position);
41 lineNumbers.putShort(line);
42 }
43
44 boolean hasLineNumbers() {
45 return lineNumbers != null;
46 }
47
48 @NonNegative
49 @Override
50 public int getSize() {
51 return lineNumbers == null ? 0 : 8 + lineNumbers.getLength();
52 }
53
54 @Override
55 public void put(@NonNull ByteVector out) {
56 if (lineNumbers != null) {
57 put(out, 2 + lineNumbers.getLength());
58 out.putShort(lineNumberCount);
59 out.putByteVector(lineNumbers);
60 }
61 }
62 }