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);
            }
        }