private BinaryRelationship GetNormalizedRelationship(BoolConstraint boolConstraint, SymbolicValue leftOperand, SymbolicValue rightOperand) { var invertCount = 0; var leftOp = leftOperand; var logicalNotLeftOp = leftOp as LogicalNotSymbolicValue; while (logicalNotLeftOp != null) { leftOp = logicalNotLeftOp.Operand; logicalNotLeftOp = leftOp as LogicalNotSymbolicValue; invertCount++; } var rightOp = rightOperand; var logicalNotRightOp = rightOp as LogicalNotSymbolicValue; while (logicalNotRightOp != null) { rightOp = logicalNotRightOp.Operand; logicalNotRightOp = rightOp as LogicalNotSymbolicValue; invertCount++; } var relationship = GetRelationship(boolConstraint, leftOp, rightOp); return(invertCount % 2 == 0 ? relationship : relationship.Negate()); }
private BinaryRelationship GetRelationship(BoolConstraint boolConstraint) { var relationship = new ComparisonRelationship(comparisonKind, LeftOperand, RightOperand); return(boolConstraint == BoolConstraint.True ? relationship : relationship.Negate()); }
private BinaryRelationship GetRelationship(BoolConstraint boolConstraint, SymbolicValue left, SymbolicValue right) { var equalsRelationship = GetRelationship(left, right); return(boolConstraint == BoolConstraint.True ? equalsRelationship : equalsRelationship.Negate()); }
internal override IEnumerable <ProgramState> SetConstraint(BoolConstraint boolConstraint, SymbolicValueConstraints leftConstraints, SymbolicValueConstraints rightConstraints, ProgramState programState) { if (boolConstraint == BoolConstraint.False) { return(RightOperand.TrySetConstraints(leftConstraints, programState) .SelectMany(ps => LeftOperand.TrySetConstraints(rightConstraints, ps))); } return(RightOperand.TrySetOppositeConstraints(leftConstraints, programState) .SelectMany(ps => LeftOperand.TrySetOppositeConstraints(rightConstraints, ps))); }
internal override IEnumerable <ProgramState> SetConstraint(BoolConstraint boolConstraint, SymbolicValueConstraint leftConstraint, SymbolicValueConstraint rightConstraint, ProgramState programState) { if (boolConstraint == BoolConstraint.True) { return(RightOperand.TrySetConstraint(leftConstraint, programState) .SelectMany(ps => LeftOperand.TrySetConstraint(rightConstraint, ps))); } return(RightOperand.TrySetConstraint(leftConstraint?.OppositeForLogicalNot, programState) .SelectMany(ps => LeftOperand.TrySetConstraint(rightConstraint?.OppositeForLogicalNot, ps))); }
public override IEnumerable <ProgramState> TrySetConstraint(SymbolicValueConstraint constraint, ProgramState currentProgramState) { var boolConstraint = constraint as BoolConstraint; if (boolConstraint == null) { return(new[] { currentProgramState }); } SymbolicValueConstraints oldConstraints; BoolConstraint oldBoolConstraint = null; if (TryGetConstraints(currentProgramState, out oldConstraints)) { oldBoolConstraint = oldConstraints.GetConstraintOrDefault <BoolConstraint>(); } if (oldBoolConstraint != null /* could also be ObjectConstraint.NotNull, which can be overridden */ && oldBoolConstraint != boolConstraint) { return(Enumerable.Empty <ProgramState>()); } SymbolicValueConstraints leftConstraints; var leftHasConstraint = LeftOperand.TryGetConstraints(currentProgramState, out leftConstraints); SymbolicValueConstraints rightConstraints; var rightHasConstraint = RightOperand.TryGetConstraints(currentProgramState, out rightConstraints); var relationship = GetRelationship(boolConstraint); var newProgramState = currentProgramState.TrySetRelationship(relationship); if (newProgramState == null) { return(Enumerable.Empty <ProgramState>()); } if (!rightHasConstraint && !leftHasConstraint) { return(new[] { newProgramState }); } return(SetConstraint(boolConstraint, leftConstraints, rightConstraints, newProgramState)); }
private IEnumerable <ProgramState> TrySetConstraint(BoolConstraint boolConstraint, SymbolicValueConstraints oldConstraints, ProgramState currentProgramState) { if (oldConstraints.HasConstraint(ObjectConstraint.Null)) { // It was null, and now it should be true or false return(Enumerable.Empty <ProgramState>()); } var oldBoolConstraint = oldConstraints.GetConstraintOrDefault <BoolConstraint>(); if (oldBoolConstraint != null && oldBoolConstraint != boolConstraint) { return(Enumerable.Empty <ProgramState>()); } // Either same bool constraint, or previously not null, and now a bool constraint return(new[] { SetConstraint(boolConstraint, currentProgramState) }); }
private BinaryRelationship GetRelationship(BoolConstraint boolConstraint) { return(GetNormalizedRelationship(boolConstraint, LeftOperand, RightOperand)); }
internal abstract IEnumerable <ProgramState> SetConstraint(BoolConstraint boolConstraint, SymbolicValueConstraint leftConstraint, SymbolicValueConstraint rightConstraint, ProgramState programState);