@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 invoke(VariableReader receiver, VariableReader instance, MethodReference method, List<? extends VariableReader> arguments, InvocationType type) { if (instance == null) { invokeSpecial(receiver, null, method, arguments); } else { switch (type) { case SPECIAL: invokeSpecial(receiver, instance, method, arguments); break; case VIRTUAL: invokeVirtual(receiver, instance, method, arguments); break; } if (method.getName().equals("getClass") && method.parameterCount() == 0 && method.getReturnType().isObject(Class.class) && receiver != null) { getNode(instance).connect(getNode(receiver).getClassValueNode()); } } }
@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 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); } }
@Override public void classConstant(VariableReader receiver, ValueType cst) { DependencyNode node = getNode(receiver); if (node != null) { node.propagate(getAnalyzer().getType("java.lang.Class")); if (!(cst instanceof ValueType.Primitive)) { StringBuilder sb = new StringBuilder(); if (cst instanceof ValueType.Object) { sb.append(((ValueType.Object) cst).getClassName()); } else { sb.append(cst.toString()); } node.getClassValueNode().propagate(getAnalyzer().getType(sb.toString())); } else { node.getClassValueNode().propagate(getAnalyzer().getType("~" + cst.toString())); } } while (cst instanceof ValueType.Array) { cst = ((ValueType.Array) cst).getItemType(); } if (cst instanceof ValueType.Object) { String className = ((ValueType.Object) cst).getClassName(); getAnalyzer().linkClass(className); } }
@Override public void createArray(VariableReader receiver, ValueType itemType, List<? extends VariableReader> dimensions) { DependencyNode node = getNode(receiver); for (int i = 0; i < dimensions.size(); ++i) { if (node == null) { break; } String itemTypeStr; if (itemType instanceof ValueType.Object) { itemTypeStr = ((ValueType.Object) itemType).getClassName(); } else { itemTypeStr = itemType.toString(); } node.propagate(getAnalyzer().getType(itemTypeStr)); node = node.getArrayItem(); itemType = ((ValueType.Array) itemType).getItemType(); } String className = extractClassName(itemType); if (className != null) { getAnalyzer().linkClass(className); } }
@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 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 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()); }