public boolean instanceOfMatches(Test test) { test.accept(this); return this.matches; }
@Override public void visit(Instanceof i) { ReflectionVar v = (ReflectionVar) i.getVar(); Object varUnderTest = v.getBindingAtJoinPoint(this.thisObj, this.targetObj, this.argsObjs); if (varUnderTest == this.thisObj || varUnderTest == this.targetObj) { this.testsSubtypeSensitiveVars = true; } }
@Override public void visit(HasAnnotation hasAnn) { // If you thought things were bad before, now we sink to new levels of horror... ReflectionVar v = (ReflectionVar) hasAnn.getVar(); int varType = getVarType(v); if (varType == AT_THIS_VAR || varType == AT_TARGET_VAR || varType == AT_ANNOTATION_VAR) { this.testsSubtypeSensitiveVars = true; } } }
public static Test makeInstanceof(Var v, ResolvedType ty) { if (ty.equals(ResolvedType.OBJECT)) return Literal.TRUE; Test e; if (ty.isAssignableFrom(v.getType())) e = Literal.TRUE; else if (! ty.isCoerceableFrom(v.getType())) e = Literal.FALSE; else e = new Instanceof(v, ty); return e; }
public static Test makeCall(Member m, Expr[] args) { return new Call(m, args); } public static Test makeFieldGetCall(Member f, Member m, Expr[] args) {
public boolean testsSubtypeSensitiveVars(Test aTest) { aTest.accept(this); return this.testsSubtypeSensitiveVars; }
@Override public void visit(Instanceof i) { }
private void recur(Test e, InstructionHandle sk, InstructionHandle fk, InstructionHandle next) { this.sk = sk; this.fk = fk; this.next = next; e.accept(this); }
public boolean instanceOfMatches(Test test) { test.accept(this); return this.matches; }
public boolean matches() { test.accept(this); return matches; }