DataValue (AbstractInsnNode insn, DataValue value) { switch (insn.getOpcode()) { case Opcodes.LNEG, Opcodes.DNEG, Opcodes.I2L, Opcodes.I2D, Opcodes.L2D, Opcodes.F2L, Opcodes.F2D, Opcodes.D2L -> { return DataValue.UnknownDataValue2; } case Opcodes.GETFIELD -> { FieldInsnNode fieldInsn = ((FieldInsnNode)insn); Member method = new Member(fieldInsn.owner, fieldInsn.name, fieldInsn.desc); EKey key = new EKey(method, Direction.Volatile, true); effects[methodNode.instructions.indexOf(insn)] = new EffectQuantum.FieldReadQuantum(key); if (value == DataValue.ThisDataValue && HardCodedPurity.getInstance().isOwnedField(fieldInsn)) { return DataValue.OwnedDataValue; } else { return ASMUtils.getSizeFast(fieldInsn.desc) == 1 ? DataValue.UnknownDataValue1 : DataValue.UnknownDataValue2; } } case Opcodes.CHECKCAST -> { return value; } case Opcodes.PUTSTATIC -> { int insnIndex = methodNode.instructions.indexOf(insn); effects[insnIndex] = EffectQuantum.TopEffectQuantum; return DataValue.UnknownDataValue1; } case Opcodes.NEWARRAY, Opcodes.ANEWARRAY -> { return DataValue.LocalDataValue; } default -> { return DataValue.UnknownDataValue1; } } }