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