@Override
  public BasicValue newOperation(AbstractInsnNode insn) throws AnalyzerException {
    int origin = insnIndex(insn);
    return switch (insn.getOpcode()) {
      case ICONST_0 -> FalseValue;
      case ICONST_1 -> TrueValue;
      case ACONST_NULL -> new TrackableNullValue(origin);
      case LDC -> {
        Object cst = ((LdcInsnNode)insn).cst;
        if (cst instanceof Type type) {
          if (type.getSort() == Type.OBJECT || type.getSort() == Type.ARRAY) {
            yield CLASS_VALUE;
          }
          if (type.getSort() == Type.METHOD) {
            yield METHOD_VALUE;
          }
        }
        else if (cst instanceof String) {
          yield STRING_VALUE;
        }
        else if (cst instanceof Handle) {
          yield METHOD_HANDLE_VALUE;
        }
        yield track(origin, super.newOperation(insn));
      }
      case NEW -> new NotNullValue(Type.getObjectType(((TypeInsnNode)insn).desc));
      default -> track(origin, super.newOperation(insn));
    };
  }
@Override
  public BasicValue newOperation(AbstractInsnNode insn)