public NonNullDomain <V> Binary(E pc, BinaryOperator op, V dest, E operand1, E operand2, Pair <bool, NonNullDomain <V> > data) { IExpressionContext <E, V> exprCtx = this.context_provider.ExpressionContext; switch (op) { case BinaryOperator.Ceq: case BinaryOperator.Cobjeq: if (data.Value.IsNull(exprCtx.Unrefine(operand2)) || exprCtx.IsZero(operand2) || data.Value.IsNull(exprCtx.Unrefine(operand1)) || exprCtx.IsZero(operand1)) { return(Recurse(new Pair <bool, NonNullDomain <V> > (!data.Key, data.Value), operand1)); } if (data.Value.IsNonNull(exprCtx.Unrefine(operand1)) || data.Value.IsNonNull(exprCtx.Unrefine(operand2))) { return(Analysis <E, V> .AssumeNonNull(exprCtx.Unrefine(operand2), data.Value)); } return(data.Value); case BinaryOperator.Cne_Un: if (data.Value.IsNull(exprCtx.Unrefine(operand2)) || exprCtx.IsZero(operand2) || data.Value.IsNull(exprCtx.Unrefine(operand1)) || exprCtx.IsZero(operand1)) { return(Recurse(data, operand1)); } return(data.Value); default: return(data.Value); } }