Exemplo n.º 1
0
        private IEnumerable <ProgramState> TrySetObjectConstraint(ObjectConstraint constraint,
                                                                  SymbolicValueConstraints oldConstraints, ProgramState programState)
        {
            if (oldConstraints.HasConstraint <BoolConstraint>())
            {
                if (constraint == ObjectConstraint.Null)
                {
                    return(Enumerable.Empty <ProgramState>());
                }

                return(new[] { programState });
            }

            var oldObjectConstraint = oldConstraints.GetConstraintOrDefault <ObjectConstraint>();

            if (oldObjectConstraint != null)
            {
                if (oldObjectConstraint != constraint)
                {
                    return(Enumerable.Empty <ProgramState>());
                }

                return(new[] { programState.SetConstraint(this, constraint) });
            }

            throw new NotSupportedException($"Neither {nameof(BoolConstraint)}, nor {nameof(ObjectConstraint)}");
        }
        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)));
        }
Exemplo n.º 3
0
        private IEnumerable <ProgramState> TrySetBoolConstraint(BoolConstraint constraint,
                                                                SymbolicValueConstraints oldConstraints, ProgramState programState)
        {
            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 != constraint)
            {
                return(Enumerable.Empty <ProgramState>());
            }

            // Either same bool constraint, or previously not null, and now a bool constraint
            return(new[] { programState.SetConstraint(this, constraint) });
        }
Exemplo n.º 4
0
        private IEnumerable <ProgramState> TrySetConstraints(SymbolicValueConstraints constraints,
                                                             ProgramState programState, bool isOppositeConstraints)
        {
            IEnumerable <ProgramState> programStates = new [] { programState };

            if (constraints == null)
            {
                return(programStates);
            }

            foreach (var constraint in constraints.GetConstraints())
            {
                programStates = programStates.SelectMany(ps =>
                                                         isOppositeConstraints
                    ? TrySetOppositeConstraint(constraint, ps)
                    : TrySetConstraint(constraint, ps));
            }

            return(programStates);
        }
Exemplo n.º 5
0
 internal abstract IEnumerable <ProgramState> SetConstraint(BoolConstraint boolConstraint,
                                                            SymbolicValueConstraints leftConstraints, SymbolicValueConstraints rightConstraints,
                                                            ProgramState programState);
Exemplo n.º 6
0
 public IEnumerable <ProgramState> TrySetOppositeConstraints(SymbolicValueConstraints constraints,
                                                             ProgramState programState)
 {
     return(TrySetConstraints(constraints, programState, true));
 }
Exemplo n.º 7
0
 public bool TryGetConstraints(ProgramState programState, out SymbolicValueConstraints constraints)
 {
     return(programState.Constraints.TryGetValue(this, out constraints));
 }