View Javadoc
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   * Writes the bytecode for the "LineNumberTable" method code attribute.
15   */
16  final class LineNumberTableWriter extends AttributeWriter {
17      /**
18       * Number of entries in the <code>LineNumberTable</code> attribute.
19       */
20      @NonNegative
21      private int lineNumberCount;
22  
23      /**
24       * The <code>LineNumberTable</code> attribute.
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  }