System.Xml.Xsl.IlGen.XmlILVisitor.TryZeroCompare C# (CSharp) Method

TryZeroCompare() private method

If the first argument is a constant value that evaluates to zero, then a more optimal instruction sequence can be generated that does not have to push the zero onto the stack. Instead, a Brfalse or Brtrue instruction can be used.
private TryZeroCompare ( QilNodeType relOp, QilNode ndFirst, QilNode ndSecond ) : bool
relOp QilNodeType
ndFirst QilNode
ndSecond QilNode
return bool
        private bool TryZeroCompare(QilNodeType relOp, QilNode ndFirst, QilNode ndSecond) {
            Debug.Assert(relOp == QilNodeType.Eq || relOp == QilNodeType.Ne);

            switch (ndFirst.NodeType) {
                case QilNodeType.LiteralInt64:
                    if ((int) (QilLiteral) ndFirst != 0) return false;
                    break;

                case QilNodeType.LiteralInt32:
                    if ((int) (QilLiteral) ndFirst != 0) return false;
                    break;

                case QilNodeType.False:
                    break;

                case QilNodeType.True:
                    // Inverse of QilNodeType.False
                    relOp = (relOp == QilNodeType.Eq) ? QilNodeType.Ne : QilNodeType.Eq;
                    break;

                default:
                    return false;
            }

            // Generate code to push second argument on stack
            NestedVisitEnsureStack(ndSecond);

            // Generate comparison code -- op == 0 or op != 0
            ZeroCompare(relOp, ndSecond.XmlType.TypeCode == XmlTypeCode.Boolean);

            return true;
        }
XmlILVisitor