private boolean checkField(TextLocation location, FieldReference field) { if (!checkClass(location, field.getClassName())) { return false; } if (!reachableFields.contains(field) || !dependencyInfo.getField(field).isMissing()) { return true; } diagnostics.error(new CallLocation(methodRef, location), "Field {{f0}} was not found", field); emitExceptionThrow(location, NoSuchFieldError.class.getName(), "Field not found: " + field); return true; }
@Override public void visit(GetFieldInstruction insn) { FieldDependencyInfo fieldDep = dependencyInfo.getField(insn.getField()); ValueDependencyInfo valueDep = fieldDep.getValue(); readValue(valueDep, insn.getReceiver()); }
@Override public void visit(PutFieldInstruction insn) { FieldDependencyInfo fieldDep = dependencyInfo.getField(insn.getField()); ValueDependencyInfo valueDep = fieldDep.getValue(); writeValue(valueDep, insn.getValue()); }
public void link(ClassHolder cls) { for (MethodHolder method : cls.getMethods().toArray(new MethodHolder[0])) { MethodReference methodRef = method.getReference(); MethodDependencyInfo methodDep = dependency.getMethod(methodRef); if (methodDep == null) { cls.removeMethod(method); } else if (!methodDep.isUsed()) { method.getModifiers().add(ElementModifier.ABSTRACT); method.setProgram(null); } else if (method.getProgram() != null) { link(method.getReference(), method.getProgram()); } } for (FieldHolder field : cls.getFields().toArray(new FieldHolder[0])) { FieldReference fieldRef = new FieldReference(cls.getName(), field.getName()); if (dependency.getField(fieldRef) == null) { cls.removeField(field); } } }
@Override public void visit(PutFieldInstruction insn) { FieldDependencyInfo fieldDep = dependencyInfo.getField(insn.getField()); ValueDependencyInfo valueDep = fieldDep.getValue(); writeValue(valueDep, insn.getValue(), tasks); }
@Override public void visit(GetFieldInstruction insn) { FieldDependencyInfo fieldDep = dependencyInfo.getField(insn.getField()); ValueDependencyInfo valueDep = fieldDep.getValue(); readValue(valueDep, insn.getReceiver(), tasks); }
private boolean checkField(TextLocation location, FieldReference field) { if (!checkClass(location, field.getClassName())) { return false; } if (!achievableFields.contains(field) || !dependencyInfo.getField(field).isMissing()) { return true; } diagnostics.error(new CallLocation(methodHolder.getReference(), location), "Field {{f0}} was not found", field); emitExceptionThrow(location, NoSuchFieldError.class.getName(), "Field not found: " + field); return true; }
public void link(DependencyInfo dependency, ClassHolder cls) { for (MethodHolder method : cls.getMethods().toArray(new MethodHolder[0])) { MethodReference methodRef = new MethodReference(cls.getName(), method.getDescriptor()); MethodDependencyInfo methodDep = dependency.getMethod(methodRef); if (methodDep == null) { cls.removeMethod(method); } else if (!methodDep.isUsed()) { method.getModifiers().add(ElementModifier.ABSTRACT); method.setProgram(null); } else if (method.getProgram() != null) { link(dependency, method); } } for (FieldHolder field : cls.getFields().toArray(new FieldHolder[0])) { FieldReference fieldRef = new FieldReference(cls.getName(), field.getName()); if (dependency.getField(fieldRef) == null) { cls.removeField(field); } } }