From bf5ff22b1ae41713ba36aab447f5b1050a4c91e5 Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Fri, 4 Jan 2019 18:46:32 +0100 Subject: [PATCH] Add missing equality-check for fraction-only case. --- .../CSharp/Syntax/TypeSystemAstBuilder.cs | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/ICSharpCode.Decompiler/CSharp/Syntax/TypeSystemAstBuilder.cs b/ICSharpCode.Decompiler/CSharp/Syntax/TypeSystemAstBuilder.cs index c26f59da5..fc0ead8d1 100644 --- a/ICSharpCode.Decompiler/CSharp/Syntax/TypeSystemAstBuilder.cs +++ b/ICSharpCode.Decompiler/CSharp/Syntax/TypeSystemAstBuilder.cs @@ -932,6 +932,15 @@ namespace ICSharpCode.Decompiler.CSharp.Syntax return Math.Abs(num) < den && new int[] { 2, 3, 5 }.Any(x => den % x == 0); } + static bool IsEqual(long num, long den, object constantValue, bool isDouble) + { + if (isDouble) { + return (double)constantValue == num / (double)den; + } else { + return (float)constantValue == num / (float)den; + } + } + const int MAX_DENOMINATOR = 1000; Expression ConvertFloatingPointLiteral(IType type, object constantValue) @@ -967,7 +976,7 @@ namespace ICSharpCode.Decompiler.CSharp.Syntax ? FractionApprox((double)constantValue, MAX_DENOMINATOR) : FractionApprox((float)constantValue, MAX_DENOMINATOR); - if (IsValidFraction(num, den) && Math.Abs(num) != 1 && Math.Abs(den) != 1) { + if (IsValidFraction(num, den) && IsEqual(num, den, constantValue, isDouble) && Math.Abs(num) != 1 && Math.Abs(den) != 1) { var left = MakeConstant(type, num); var right = MakeConstant(type, den); return new BinaryOperatorExpression(left, BinaryOperatorType.Divide, right).WithoutILInstruction()