@Override public void nullCheck(VariableReader receiver, VariableReader value) { DependencyNode valueNode = getNode(value); DependencyNode receiverNode = getNode(receiver); if (valueNode != null) { valueNode.connect(receiverNode); } MethodDependency npeMethod = getAnalyzer().linkMethod(NPE_INIT_METHOD); npeMethod.addLocation(getCallLocation()); npeMethod.use(); }
@Override public void cloneArray(VariableReader receiver, VariableReader array) { DependencyNode arrayNode = getNode(array); MethodDependency cloneDep = getAnalyzer().linkMethod(CLONE_METHOD); cloneDep.addLocation(impreciseLocation); cloneDep.use(); }
@Override public void stringConstant(VariableReader receiver, String cst) { DependencyNode node = getNode(receiver); if (node != null) { node.propagate(getAnalyzer().getType("java.lang.String")); } MethodDependency method = getAnalyzer().linkMethod(STRING_INIT_FROM_CHARS_METHOD); method.addLocation(getCallLocation()); method.use(); }
@Override public void cloneArray(VariableReader receiver, VariableReader array) { DependencyNode arrayNode = getNode(array); DependencyNode receiverNode = getNode(receiver); if (arrayNode != null && receiverNode != null) { arrayNode.addConsumer(receiverNode::propagate); arrayNode.getArrayItem().connect(receiverNode.getArrayItem()); } MethodDependency cloneDep = getAnalyzer().linkMethod(CLONE_METHOD); cloneDep.addLocation(getCallLocation()); arrayNode.connect(cloneDep.getVariable(0)); cloneDep.use(); }
public FastDependencyAnalyzer(ClassReaderSource classSource, ClassLoader classLoader, ServiceRepository services, Diagnostics diagnostics) { super(classSource, classLoader, services, diagnostics); instancesNode = new DependencyNode(this, null); classesNode = new DependencyNode(this, null); instancesNode.addConsumer(type -> { getSubtypeNode(type.getName()).propagate(type); }); }
private void reachArrayCopy(MethodDependency method) { DependencyNode src = method.getVariable(1); DependencyNode dest = method.getVariable(3); src.getArrayItem().connect(dest.getArrayItem()); } }
@Override public void createArray(VariableReader receiver, ValueType itemType, VariableReader size) { DependencyNode node = getNode(receiver); if (node != null) { node.propagate(getAnalyzer().getType("[" + itemType)); } String className = extractClassName(itemType); if (className != null) { getAnalyzer().linkClass(className); } }
private void processAsyncMethod(MethodDependency methodDep) { if (asyncSupported) { linkMethod(MONITOR_ENTER_METHOD).use(); } linkMethod(MONITOR_ENTER_SYNC_METHOD).use(); if (asyncSupported) { linkMethod(MONITOR_EXIT_METHOD).use(); } linkMethod(MONITOR_EXIT_SYNC_METHOD).use(); }
void consume(DependencyType type) { if (!destination.hasType(type) && filterType(type) && destination.filter(type)) { propagate(type); } }
@Override DependencyNode createParameterNode(MethodReference method, ValueType type, int index) { DependencyNode node = createNode(type); node.method = method; if (shouldTag) { node.setTag(method + ":" + index); } return node; }
private void activateDependencyPlugin(MethodDependency methodDep) { attachDependencyPlugin(methodDep); if (methodDep.dependencyPlugin != null) { methodDep.dependencyPlugin.methodReached(agent, methodDep); } }
@Override protected void invokeVirtual(VariableReader receiver, VariableReader instance, MethodReference method, List<? extends VariableReader> arguments) { dependencyAnalyzer.getVirtualCallConsumer(method).addLocation(impreciseLocation); }
private ClassDependency createClassDependency(String className) { ClassReader cls = classSource.get(className); ClassDependency dependency = new ClassDependency(this, className, cls); return dependency; }
private void propagateTypes(Transition transition) { if (typeSet != null) { dependencyAnalyzer.schedulePropagation(transition, getTypesInternal()); } }
@Override public void monitorEnter(VariableReader objectRef) { if (getAnalyzer().asyncSupported) { MethodDependency methodDep = getAnalyzer().linkMethod(MONITOR_ENTER_METHOD); methodDep.addLocation(getCallLocation()); getNode(objectRef).connect(methodDep.getVariable(1)); methodDep.use(); } MethodDependency methodDep = getAnalyzer().linkMethod(MONITOR_ENTER_SYNC_METHOD); methodDep.addLocation(getCallLocation()); getNode(objectRef).connect(methodDep.getVariable(1)); methodDep.use(); }
@Override public void create(VariableReader receiver, String type) { getAnalyzer().linkClass(type); DependencyNode node = getNode(receiver); if (node != null) { node.propagate(getAnalyzer().getType(type)); } }
@Override public void monitorExit(VariableReader objectRef) { if (getAnalyzer().asyncSupported) { MethodDependency methodDep = getAnalyzer().linkMethod(MONITOR_EXIT_METHOD); methodDep.addLocation(getCallLocation()); getNode(objectRef).connect(methodDep.getVariable(1)); methodDep.use(); } MethodDependency methodDep = getAnalyzer().linkMethod(MONITOR_EXIT_SYNC_METHOD); methodDep.addLocation(getCallLocation()); getNode(objectRef).connect(methodDep.getVariable(1)); methodDep.use(); }