public void connect(DependencyNode node) { connect(node, null); }
public void connect(DependencyNode node, DependencyTypeFilter filter) { if (connectWithoutChildNodes(node, filter)) { connectArrayItemNodes(node); if (classValueNode != null && classValueNode != this) { classValueNode.connect(node.getClassValueNode()); } } }
@Override public void exit(VariableReader valueToReturn) { if (valueToReturn != null) { DependencyNode node = nodes[valueToReturn.getIndex()]; if (node != null) { node.connect(resultNode); } } }
@Override public void unwrapArray(VariableReader receiver, VariableReader array, ArrayElementType elementType) { DependencyNode arrayNode = nodes[array.getIndex()]; DependencyNode receiverNode = nodes[receiver.getIndex()]; if (arrayNode != null && receiverNode != null) { arrayNode.connect(receiverNode); } }
private void connectClassValueNodes() { if (classNodeComplete) { return; } classNodeComplete = true; if (classNodeParent == null || classNodeParent.transitions == null) { return; } for (Transition transition : classNodeParent.transitionList.toArray(Transition.class)) { connect(transition.destination.getClassValueNode()); } }
@Override public void assign(VariableReader receiver, VariableReader assignee) { DependencyNode valueNode = nodes[assignee.getIndex()]; DependencyNode receiverNode = nodes[receiver.getIndex()]; if (valueNode != null && receiverNode != null) { valueNode.connect(receiverNode); } }
@Override public void methodReached(final DependencyAgent agent, MethodDependency method) { if (!method.getReference().getClassName().equals(Platform.class.getName())) { return; } switch (method.getReference().getName()) { case "objectFromResource": allClasses.connect(method.getResult()); break; } } }
private void reachArrayCopy(MethodDependency method) { DependencyNode src = method.getVariable(1); DependencyNode dest = method.getVariable(3); src.getArrayItem().connect(dest.getArrayItem()); } }
@Override public void methodReached(DependencyAgent agent, MethodDependency method) { MethodDependency addMethod = agent.linkMethod(new MethodReference(PlatformQueue.class, "wrap", Object.class, PlatformObject.class)); addMethod.getVariable(1).connect(method.getResult()); }
@Override public void methodReached(DependencyAgent agent, MethodDependency method) { switch (method.getMethod().getName()) { case "clone": method.getVariable(0).connect(method.getResult()); break; } } }
private void reachSet(DependencyAgent agent, MethodDependency method) { method.getVariable(3).connect(method.getVariable(1).getArrayItem()); method.getVariable(1).addConsumer(type -> { if (type.getName().startsWith("[")) { String typeName = type.getName().substring(1); for (int i = 0; i < primitiveTypes.length; ++i) { if (primitiveTypes[i].toString().equals(typeName)) { String wrapper = "java.lang." + primitiveWrappers[i]; MethodReference methodRef = new MethodReference(wrapper, primitives[i].toLowerCase() + "Value", primitiveTypes[i]); agent.linkMethod(methodRef).use(); } } } }); } }
@Override public void methodReached(DependencyAgent agent, MethodDependency method) { MethodReader reader = method.getMethod(); if (reader.getOwnerName().equals(Platform.class.getName()) && reader.getName().equals("newInstanceImpl")) { allClassesNode.connect(method.getResult()); MethodReference methodRef = reader.getReference(); method.getResult().addConsumer(type -> attachConstructor(agent, type.getName(), new CallLocation(methodRef))); } }
@Override public void putElement(VariableReader array, VariableReader index, VariableReader value, ArrayElementType type) { if (isPrimitive(type)) { return; } DependencyNode valueNode = nodes[value.getIndex()]; DependencyNode arrayNode = nodes[array.getIndex()]; if (valueNode != null && arrayNode != null && valueNode != arrayNode.getArrayItem()) { valueNode.connect(arrayNode.getArrayItem()); } }
@Override public void getElement(VariableReader receiver, VariableReader array, VariableReader index, ArrayElementType type) { if (isPrimitive(type)) { return; } DependencyNode arrayNode = nodes[array.getIndex()]; DependencyNode receiverNode = nodes[receiver.getIndex()]; if (arrayNode != null && receiverNode != null && receiverNode != arrayNode.getArrayItem()) { arrayNode.getArrayItem().connect(receiverNode); } }
@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(); }
@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 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 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(); }
@Override public void getField(VariableReader receiver, VariableReader instance, FieldReference field, ValueType fieldType) { FieldDependency fieldDep = getAnalyzer().linkField(field); fieldDep.addLocation(getCallLocation()); if (!(fieldType instanceof ValueType.Primitive)) { DependencyNode receiverNode = getNode(receiver); if (receiverNode != null) { fieldDep.getValue().connect(receiverNode); } } initClass(field.getClassName()); }
@Override public void putField(VariableReader instance, FieldReference field, VariableReader value, ValueType fieldType) { FieldDependency fieldDep = getAnalyzer().linkField(field); fieldDep.addLocation(getCallLocation()); if (!(fieldType instanceof ValueType.Primitive)) { DependencyNode valueNode = getNode(value); if (valueNode != null) { valueNode.connect(fieldDep.getValue()); } } initClass(field.getClassName()); }