@Override
  public DataValue newOperation(AbstractInsnNode insn) {
    switch (insn.getOpcode()) {
      case Opcodes.NEW -> {
        return DataValue.LocalDataValue;
      }
      case Opcodes.LCONST_0, Opcodes.LCONST_1, Opcodes.DCONST_0, Opcodes.DCONST_1 -> {
        return DataValue.UnknownDataValue2;
      }
      case Opcodes.LDC -> {
        Object cst = ((LdcInsnNode)insn).cst;
        int size = (cst instanceof Long || cst instanceof Double) ? 2 : 1;
        return size == 1 ? DataValue.UnknownDataValue1 : DataValue.UnknownDataValue2;
      }
      case Opcodes.GETSTATIC -> {
        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);
        int size = Type.getType(((FieldInsnNode)insn).desc).getSize();
        return size == 1 ? DataValue.UnknownDataValue1 : DataValue.UnknownDataValue2;
      }
      default -> {
        return DataValue.UnknownDataValue1;
      }
    }
  }
@Override
  public DataValue newOperation(AbstractInsnNode insn)