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