private static bool CanPullComparisonUp(AstCode code, XTypeReference arg1, XTypeReference arg2, PullTarget target) { if (arg1 == null || arg2 == null) return false; bool isReference = arg1.IsDexObject() && arg1.IsDexObject(); if (!isReference && !arg1.IsSame(arg2)) return false; if (target == PullTarget.Comparison) return true; if (arg1.Is(XTypeReferenceKind.Float)) return false; if (arg1.IsDexWide()) return false; bool isEq = IsEqualsBranchOrComparison(code); if (isEq) return true; bool isUnsigned = arg1.IsUInt16() || arg1.IsUInt32(); // TODO: check if we really have to exclude unsigned. if (isReference || isUnsigned) return false; return true; }
private static bool CanPullComparisonUp(AstCode code, XTypeReference arg1, XTypeReference arg2, PullTarget target) { if (arg1 == null || arg2 == null) { return(false); } bool isReference = arg1.IsDexObject() && arg1.IsDexObject(); if (!isReference && !arg1.IsSame(arg2)) { return(false); } if (target == PullTarget.Comparison) { return(true); } if (arg1.Is(XTypeReferenceKind.Float)) { return(false); } if (arg1.IsDexWide()) { return(false); } bool isEq = IsEqualsBranchOrComparison(code); if (isEq) { return(true); } bool isUnsigned = arg1.IsUInt16() || arg1.IsUInt32(); // TODO: check if we really have to exclude unsigned. if (isReference || isUnsigned) { return(false); } return(true); }
private static bool? InvertComparisonIfPullComparisonUpToEquals(AstExpression node, PullTarget target) { bool? reverse = ReverseCodeOnEqualCollapse(node); if (reverse == null) return null; var expr = node.Arguments[0]; if (!expr.Code.IsCompare() || expr.Arguments.Count != 2) return null; var arg1 = expr.Arguments[0]; var arg2 = expr.Arguments[1]; if (!CanPullComparisonUp(expr.Code, arg1.GetResultType(), arg2.GetResultType(), target)) return null; return reverse; }
private static bool?InvertComparisonIfPullComparisonUpToEquals(AstExpression node, PullTarget target) { bool?reverse = ReverseCodeOnEqualCollapse(node); if (reverse == null) { return(null); } var expr = node.Arguments[0]; if (!expr.Code.IsCompare() || expr.Arguments.Count != 2) { return(null); } var arg1 = expr.Arguments[0]; var arg2 = expr.Arguments[1]; if (!CanPullComparisonUp(expr.Code, arg1.GetResultType(), arg2.GetResultType(), target)) { return(null); } return(reverse); }