View Javadoc
1   /*
2    * MIT License
3    * Copyright (c) 2006-2025 JMockit developers
4    * See LICENSE file for full license text.
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   * Writes the bytecode for the "LineNumberTable" method code attribute.
20   */
21  final class LineNumberTableWriter extends AttributeWriter {
22      /**
23       * Number of entries in the <code>LineNumberTable</code> attribute.
24       */
25      @NonNegative
26      private int lineNumberCount;
27  
28      /**
29       * The <code>LineNumberTable</code> attribute.
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  }