1 package mockit.asm.fields;
2
3 import edu.umd.cs.findbugs.annotations.NonNull;
4 import edu.umd.cs.findbugs.annotations.Nullable;
5
6 import mockit.asm.AnnotatedReader;
7 import mockit.asm.classes.ClassReader;
8 import mockit.asm.classes.ClassVisitor;
9
10 import org.checkerframework.checker.index.qual.NonNegative;
11
12 public final class FieldReader extends AnnotatedReader {
13 @NonNull
14 private final ClassVisitor cv;
15 @Nullable
16 private Object constantValue;
17
18 public FieldReader(@NonNull ClassReader cr, @NonNull ClassVisitor cv) {
19 super(cr);
20 this.cv = cv;
21 }
22
23
24
25
26
27
28 @NonNegative
29 public int readFields() {
30 for (int fieldCount = readUnsignedShort(); fieldCount > 0; fieldCount--) {
31 readField();
32 }
33
34 return codeIndex;
35 }
36
37 private void readField() {
38 access = readUnsignedShort();
39 String name = readNonnullUTF8();
40 String desc = readNonnullUTF8();
41 constantValue = null;
42
43 readAttributes();
44
45 FieldVisitor fv = cv.visitField(access, name, desc, signature, constantValue);
46
47 if (fv != null) {
48 readAnnotations(fv);
49 fv.visitEnd();
50 }
51 }
52
53 @Nullable
54 @Override
55 protected Boolean readAttribute(@NonNull String attributeName) {
56 if ("ConstantValue".equals(attributeName)) {
57 int constItemIndex = readUnsignedShort();
58
59 if (constItemIndex > 0) {
60 constantValue = readConst(constItemIndex);
61 }
62
63 return true;
64 }
65
66 return null;
67 }
68 }