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.classes;
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.util.ByteVector;
14  
15  import org.checkerframework.checker.index.qual.NonNegative;
16  
17  final class InnerClassesWriter extends AttributeWriter {
18      @NonNull
19      private final ByteVector innerClasses;
20      @NonNegative
21      private int innerClassesCount;
22  
23      InnerClassesWriter(@NonNull ConstantPoolGeneration cp) {
24          super(cp, "InnerClasses");
25          innerClasses = new ByteVector();
26      }
27  
28      void add(@NonNull String name, @Nullable String outerName, @Nullable String innerName, int access) {
29          innerClasses.putShort(cp.newClass(name));
30          innerClasses.putShort(outerName == null ? 0 : cp.newClass(outerName));
31          innerClasses.putShort(innerName == null ? 0 : cp.newUTF8(innerName));
32          innerClasses.putShort(access);
33          innerClassesCount++;
34      }
35  
36      @NonNegative
37      @Override
38      public int getSize() {
39          return 8 + innerClasses.getLength();
40      }
41  
42      @Override
43      public void put(@NonNull ByteVector out) {
44          put(out, 2 + innerClasses.getLength());
45          out.putShort(innerClassesCount);
46          out.putByteVector(innerClasses);
47      }
48  }