@Override public List<ProgramState> setConstraint(ProgramState initialProgramState, BooleanConstraint booleanConstraint) { ProgramState programState = checkRelation(booleanConstraint, initialProgramState); if (programState == null) { return ImmutableList.of(); } List<ProgramState> results = new ArrayList<>(); List<ProgramState> copiedConstraints = copyConstraint(leftOp, rightOp, programState, booleanConstraint); for (ProgramState ps : copiedConstraints) { List<ProgramState> copiedConstraintsRightToLeft = copyConstraint(rightOp, leftOp, ps, booleanConstraint); if (copiedConstraintsRightToLeft.size() == 1 && copiedConstraintsRightToLeft.get(0).equals(programState)) { results.add(programState.addConstraint(this, booleanConstraint)); } else { results.addAll(copiedConstraintsRightToLeft); } } return results; }
@Override public List<ProgramState> setConstraint(ProgramState programState, BooleanConstraint booleanConstraint) { if (booleanConstraint.isTrue()) { Constraint constraint = programState.getConstraint(operand); if (constraint !=null && constraint.isNull()) { // irrealizable constraint : instance of true if operand is null return ImmutableList.of(); } // if instanceof is true then we know for sure that expression is not null. List<ProgramState> ps = operand.setConstraint(programState, ObjectConstraint.NOT_NULL); if (ps.size() == 1 && ps.get(0).equals(programState)) { // FIXME we already know that operand is NOT NULL, so we add a different constraint to distinguish program state. Typed Constraint // should store the deduced type. return ImmutableList.of(programState.addConstraint(this, new TypedConstraint())); } return ps; } return ImmutableList.of(programState); } }
private List<ProgramState> copyAllConstraints(ProgramState initialState, Set<RelationalSymbolicValue> knownRelations) { ProgramState programState = initialState; if (programState.canReach(leftOp) || programState.canReach(rightOp)) { programState = programState.addConstraint(this, BooleanConstraint.TRUE); } List<ProgramState> results = new ArrayList<>(); List<ProgramState> copiedConstraints = copyConstraintFromTo(leftOp, rightOp, programState, knownRelations); if (Kind.METHOD_EQUALS == kind || Kind.NOT_METHOD_EQUALS == kind) { copiedConstraints = addNullConstraintsForBooleanWrapper(programState, copiedConstraints); } for (ProgramState ps : copiedConstraints) { List<ProgramState> copiedConstraintsRightToLeft = copyConstraintFromTo(rightOp, leftOp, ps, knownRelations); if (copiedConstraintsRightToLeft.size() == 1 && copiedConstraintsRightToLeft.get(0).equals(programState)) { results.add(programState.addConstraint(this, BooleanConstraint.TRUE)); } else { results.addAll(copiedConstraintsRightToLeft); } } return results; }
@Override public List<ProgramState> setConstraint(ProgramState programState, BooleanConstraint booleanConstraint) { if (booleanConstraint.isTrue()) { ObjectConstraint constraint = programState.getConstraint(operand, ObjectConstraint.class); if (constraint !=null && constraint.isNull()) { // irrealizable constraint : instance of true if operand is null return ImmutableList.of(); } // if instanceof is true then we know for sure that expression is not null. List<ProgramState> ps = operand.setConstraint(programState, ObjectConstraint.NOT_NULL); if (ps.size() == 1 && ps.get(0).equals(programState)) { // FIXME we already know that operand is NOT NULL, so we add a different constraint to distinguish program state. Typed Constraint // should store the deduced type. return ImmutableList.of(programState.addConstraint(this, new TypedConstraint(Symbols.unknownType.fullyQualifiedName()))); } return ps; } return ImmutableList.of(programState); } }
@Override public List<ProgramState> setConstraint(ProgramState programState, BooleanConstraint booleanConstraint) { if (booleanConstraint.isTrue()) { ObjectConstraint constraint = programState.getConstraint(operand, ObjectConstraint.class); if (constraint !=null && constraint.isNull()) { // irrealizable constraint : instance of true if operand is null return ImmutableList.of(); } // if instanceof is true then we know for sure that expression is not null. List<ProgramState> ps = operand.setConstraint(programState, ObjectConstraint.NOT_NULL); if (ps.size() == 1 && ps.get(0).equals(programState)) { // FIXME we already know that operand is NOT NULL, so we add a different constraint to distinguish program state. Typed Constraint // should store the deduced type. return ImmutableList.of(programState.addConstraint(this, new TypedConstraint(Symbols.unknownType.fullyQualifiedName()))); } return ps; } return ImmutableList.of(programState); } }
private List<ProgramState> copyAllConstraints(ProgramState initialState, Set<RelationalSymbolicValue> knownRelations) { ProgramState programState = initialState; if (programState.canReach(leftOp) || programState.canReach(rightOp)) { programState = programState.addConstraint(this, BooleanConstraint.TRUE); } List<ProgramState> results = new ArrayList<>(); List<ProgramState> copiedConstraints = copyConstraintFromTo(leftOp, rightOp, programState, knownRelations); if (Kind.METHOD_EQUALS == kind || Kind.NOT_METHOD_EQUALS == kind) { copiedConstraints = addNullConstraintsForBooleanWrapper(programState, copiedConstraints); } for (ProgramState ps : copiedConstraints) { List<ProgramState> copiedConstraintsRightToLeft = copyConstraintFromTo(rightOp, leftOp, ps, knownRelations); if (copiedConstraintsRightToLeft.size() == 1 && copiedConstraintsRightToLeft.get(0).equals(programState)) { results.add(programState.addConstraint(this, BooleanConstraint.TRUE)); } else { results.addAll(copiedConstraintsRightToLeft); } } return results; }