@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()); }
private FieldDependency createFieldNode(FieldReference fieldRef, FieldReader field) { DependencyNode node = createFieldNode(fieldRef, field != null ? field.getType() : null); return new FieldDependency(node, field, fieldRef); }
public FieldDependency linkField(FieldReference fieldRef) { FieldDependency dep = fieldCache.map(fieldRef); if (!dep.activated) { dep.activated = true; if (!dep.isMissing()) { for (DependencyListener listener : listeners) { listener.fieldReached(agent, dep); } } } return dep; }
DependencyAnalyzer(ClassReaderSource classSource, ClassLoader classLoader, ServiceRepository services, Diagnostics diagnostics) { unprocessedClassSource = classSource; this.diagnostics = diagnostics; this.classSource = new DependencyClassSource(classSource, diagnostics, incrementalCache); classHierarchy = new ClassHierarchy(this.classSource); this.classLoader = classLoader; this.services = services; fieldReaderCache = new CachedMapper<>(preimage -> this.classSource.resolveMutable(preimage)); fieldCache = new CachedMapper<>(preimage -> { FieldReader field = fieldReaderCache.map(preimage); if (field != null && !field.getReference().equals(preimage)) { return fieldCache.map(field.getReference()); } FieldDependency node = createFieldNode(preimage, field); if (field != null && field.getInitialValue() instanceof String) { node.getValue().propagate(getType("java.lang.String")); } return node; }); classCache = new CachedMapper<>(this::createClassDependency); agent = new DependencyAgent(this); }
private FieldDependency createFieldNode(FieldReference fieldRef, FieldReader field) { DependencyNode node = createNode(); if (shouldLog) { node.setTag(fieldRef.getClassName() + "#" + fieldRef.getFieldName()); } FieldDependency dep = new FieldDependency(node, field, fieldRef); if (!dep.isMissing()) { tasks.add(() -> linkClass(fieldRef.getClassName(), null).initClass(null)); } return dep; }
@Override public void getField(VariableReader receiver, VariableReader instance, FieldReference field, ValueType fieldType) { FieldDependency fieldDep = dependencyChecker.linkField(field, new CallLocation(caller.getMethod(), currentLocation)); if (!(fieldType instanceof ValueType.Primitive)) { DependencyNode receiverNode = nodes[receiver.getIndex()]; 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()); }
@Override public void putField(VariableReader instance, FieldReference field, VariableReader value, ValueType fieldType) { FieldDependency fieldDep = dependencyChecker.linkField(field, new CallLocation(caller.getMethod(), currentLocation)); if (!(fieldType instanceof ValueType.Primitive)) { DependencyNode valueNode = nodes[value.getIndex()]; if (valueNode != null) { valueNode.connect(fieldDep.getValue()); } } initClass(field.getClassName()); }
public FieldDependency linkField(FieldReference fieldRef, CallLocation location) { if (completing) { throw new IllegalStateException("Can't submit class during completion phase"); } boolean added; if (location != null) { added = callGraph.getNode(location.getMethod()).addFieldAccess(fieldRef, location.getSourceLocation()); } else { added = fieldsAddedByRoot.add(fieldRef); } FieldDependency dep = fieldCache.map(fieldRef); if (!dep.isMissing()) { tasks.add(() -> linkClass(fieldRef.getClassName(), location).initClass(location)); } if (!dep.isMissing() && added) { for (DependencyListener listener : listeners) { listener.fieldReached(agent, dep, location); } } return dep; }
private void handleFieldSet(DependencyAgent agent, MethodDependency method) { CallLocation location = new CallLocation(method.getReference()); DependencyNode classValueNode = agent.linkMethod(getFields) .addLocation(location) .getVariable(0).getClassValueNode(); classValueNode.addConsumer(reflectedType -> { if (reflectedType.getName().startsWith("[")) { return; } Set<String> accessibleFields = getAccessibleFields(agent, reflectedType.getName()); ClassReader cls = agent.getClassSource().get(reflectedType.getName()); for (String fieldName : accessibleFields) { FieldReader field = cls.getField(fieldName); FieldDependency fieldDep = agent.linkField(field.getReference()).addLocation(location); propagateSet(agent, field.getType(), method.getVariable(2), fieldDep.getValue(), location); linkClassIfNecessary(agent, field, location); } }); }
private void handleFieldGet(DependencyAgent agent, MethodDependency method) { CallLocation location = new CallLocation(method.getReference()); DependencyNode classValueNode = agent.linkMethod(getFields) .addLocation(location) .getVariable(0).getClassValueNode(); classValueNode.addConsumer(reflectedType -> { if (reflectedType.getName().startsWith("[")) { return; } Set<String> accessibleFields = getAccessibleFields(agent, reflectedType.getName()); ClassReader cls = agent.getClassSource().get(reflectedType.getName()); for (String fieldName : accessibleFields) { FieldReader field = cls.getField(fieldName); FieldDependency fieldDep = agent.linkField(field.getReference()) .addLocation(location); propagateGet(agent, field.getType(), fieldDep.getValue(), method.getResult(), location); linkClassIfNecessary(agent, field, location); } }); }