@NotNull
  private TrackableCallValue methodCall(int opCode, int origin, Member method, List<? extends BasicValue> values) {
    Type retType = Type.getReturnType(method.methodDesc);
    boolean stable = opCode == INVOKESTATIC || opCode == INVOKESPECIAL;
    boolean thisCall = false;
    if (opCode != INVOKESTATIC) {
      BasicValue receiver = values.remove(0);
      if (receiver instanceof NthParamValue) {
        dereferencedParams[((NthParamValue)receiver).n] = true;
      }
      if (receiver instanceof Trackable) {
        dereferencedValues[((Trackable)receiver).getOriginInsnIndex()] = true;
      }
      thisCall = receiver == ThisValue;
    }

    for (int i = 0; i < values.size(); i++) {
      if (values.get(i) instanceof NthParamValue) {
        int n = ((NthParamValue)values.get(i)).n;
        if (opCode == INVOKEINTERFACE) {
          notNullableParams[n] = true;
        }
        else {
          Set<ParamKey> npKeys = parameterFlow[n];
          if (npKeys == null) {
            npKeys = new HashSet<>();
            parameterFlow[n] = npKeys;
          }
          npKeys.add(new ParamKey(method, i, stable));
        }
      }
    }
    return new TrackableCallValue(origin, retType, method, values, stable, thisCall);
  }
@NotNull
  private TrackableCallValue methodCall(int opCode, int origin, Member method, List<? extends BasicValue> values)