@Override
  public DataValue unaryOperation(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;
      }
    }
  }
@Override
  public DataValue unaryOperation(AbstractInsnNode insn, DataValue value)