TrackableCallValue (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); }