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