1
2
3
4
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 }