record (Set<Member> staticFinalFields, Set<Member> volatileFields) { static @NotNull FieldData read(@NotNull ClassReader classReader) { Set<Member> staticFields = new HashSet<>(); Set<Member> volatileFields = new HashSet<>(); classReader.accept(new ClassVisitor(Opcodes.API_VERSION) { @Override public FieldVisitor visitField(int access, String name, String desc, String signature, Object value) { int modifiers = Opcodes.ACC_STATIC | Opcodes.ACC_FINAL; if ((access & modifiers) == modifiers && (access & (Opcodes.ACC_ENUM | Opcodes.ACC_SYNTHETIC)) == 0 && (desc.startsWith("L") || desc.startsWith("["))) { staticFields.add(new Member(classReader.getClassName(), name, desc)); } if ((access & Opcodes.ACC_VOLATILE) != 0) { volatileFields.add(new Member(classReader.getClassName(), name, desc)); } return null; } }, ClassReader.SKIP_FRAMES | ClassReader.SKIP_DEBUG | ClassReader.SKIP_CODE); return new FieldData(staticFields, volatileFields); } void registerVolatileFields(Map<EKey, Equations> equations) { for (Member field : volatileFields) { EKey fieldKey = new EKey(field, Out, true); equations.put(fieldKey, new Equations(Collections.singletonList(new DirectionResultPair(Volatile.asInt(), VOLATILE_EFFECTS)), true)); } } }