Browse Source

Exclude whole numbers from "constant unfolding" for floating point literals.

pull/1350/head
Siegfried Pammer 7 years ago
parent
commit
2a571bef1a
  1. 5
      ICSharpCode.Decompiler.Tests/TestCases/Pretty/WellKnownConstants.cs
  2. 4
      ICSharpCode.Decompiler.Tests/TestCases/Pretty/WellKnownConstants.il
  3. 4
      ICSharpCode.Decompiler.Tests/TestCases/Pretty/WellKnownConstants.opt.il
  4. 4
      ICSharpCode.Decompiler.Tests/TestCases/Pretty/WellKnownConstants.opt.roslyn.il
  5. 4
      ICSharpCode.Decompiler.Tests/TestCases/Pretty/WellKnownConstants.roslyn.il
  6. 11
      ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs
  7. 4
      ICSharpCode.Decompiler/CSharp/Syntax/TypeSystemAstBuilder.cs

5
ICSharpCode.Decompiler.Tests/TestCases/Pretty/WellKnownConstants.cs

@ -67,6 +67,11 @@ namespace ICSharpCode.Decompiler.Tests.TestCases.Pretty @@ -67,6 +67,11 @@ namespace ICSharpCode.Decompiler.Tests.TestCases.Pretty
public const decimal DecimalMaxValue = decimal.MaxValue;
public const decimal DecimalMinValue = decimal.MinValue;
public const float Float_One = 1f;
public const double Double_One = 1.0;
public const float Float_Two = 2f;
public const double Double_Two = 2.0;
public const float Float_PI = (float)Math.PI;
public const float Float_HalfOfPI = (float)Math.PI / 2f;
public const float Float_QuarterOfPI = (float)Math.PI / 4f;

4
ICSharpCode.Decompiler.Tests/TestCases/Pretty/WellKnownConstants.il

@ -78,6 +78,10 @@ @@ -78,6 +78,10 @@
uint32,
uint32) = ( 01 00 00 80 FF FF FF FF FF FF FF FF FF FF FF FF
00 00 )
.field public static literal float32 Float_One = float32(1.)
.field public static literal float64 Double_One = float64(1.)
.field public static literal float32 Float_Two = float32(2.)
.field public static literal float64 Double_Two = float64(2.)
.field public static literal float32 Float_PI = float32(3.1415927)
.field public static literal float32 Float_HalfOfPI = float32(1.5707964)
.field public static literal float32 Float_QuarterOfPI = float32(0.78539819)

4
ICSharpCode.Decompiler.Tests/TestCases/Pretty/WellKnownConstants.opt.il

@ -78,6 +78,10 @@ @@ -78,6 +78,10 @@
uint32,
uint32) = ( 01 00 00 80 FF FF FF FF FF FF FF FF FF FF FF FF
00 00 )
.field public static literal float32 Float_One = float32(1.)
.field public static literal float64 Double_One = float64(1.)
.field public static literal float32 Float_Two = float32(2.)
.field public static literal float64 Double_Two = float64(2.)
.field public static literal float32 Float_PI = float32(3.1415927)
.field public static literal float32 Float_HalfOfPI = float32(1.5707964)
.field public static literal float32 Float_QuarterOfPI = float32(0.78539819)

4
ICSharpCode.Decompiler.Tests/TestCases/Pretty/WellKnownConstants.opt.roslyn.il

@ -82,6 +82,10 @@ @@ -82,6 +82,10 @@
uint32,
uint32) = ( 01 00 00 80 FF FF FF FF FF FF FF FF FF FF FF FF
00 00 )
.field public static literal float32 Float_One = float32(1.)
.field public static literal float64 Double_One = float64(1.)
.field public static literal float32 Float_Two = float32(2.)
.field public static literal float64 Double_Two = float64(2.)
.field public static literal float32 Float_PI = float32(3.1415927)
.field public static literal float32 Float_HalfOfPI = float32(1.5707964)
.field public static literal float32 Float_QuarterOfPI = float32(0.78539819)

4
ICSharpCode.Decompiler.Tests/TestCases/Pretty/WellKnownConstants.roslyn.il

@ -82,6 +82,10 @@ @@ -82,6 +82,10 @@
uint32,
uint32) = ( 01 00 00 80 FF FF FF FF FF FF FF FF FF FF FF FF
00 00 )
.field public static literal float32 Float_One = float32(1.)
.field public static literal float64 Double_One = float64(1.)
.field public static literal float32 Float_Two = float32(2.)
.field public static literal float64 Double_Two = float64(2.)
.field public static literal float32 Float_PI = float32(3.1415927)
.field public static literal float32 Float_HalfOfPI = float32(1.5707964)
.field public static literal float32 Float_QuarterOfPI = float32(0.78539819)

11
ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs

@ -2270,9 +2270,14 @@ namespace ICSharpCode.Decompiler.CSharp @@ -2270,9 +2270,14 @@ namespace ICSharpCode.Decompiler.CSharp
container.Peek().Elements.Add(aie);
container.Push(aie);
}
astBuilder.UseSpecialConstants = !type.IsCSharpPrimitiveIntegerType();
var val = Translate(value, typeHint: type).ConvertTo(type, this, allowImplicitConversion: true);
astBuilder.UseSpecialConstants = true;
TranslatedExpression val;
var old = astBuilder.UseSpecialConstants;
try {
astBuilder.UseSpecialConstants = !type.IsCSharpPrimitiveIntegerType();
val = Translate(value, typeHint: type).ConvertTo(type, this, allowImplicitConversion: true);
} finally {
astBuilder.UseSpecialConstants = old;
}
container.Peek().Elements.Add(val);
elementResolveResults.Add(val.ResolveResult);
while (container.Count > 0 && container.Peek().Elements.Count == dimensionSizes[container.Count - 1]) {

4
ICSharpCode.Decompiler/CSharp/Syntax/TypeSystemAstBuilder.cs

@ -937,11 +937,11 @@ namespace ICSharpCode.Decompiler.CSharp.Syntax @@ -937,11 +937,11 @@ namespace ICSharpCode.Decompiler.CSharp.Syntax
Expression expr = null;
if (isDouble) {
if ((double)constantValue >= int.MaxValue || (double)constantValue <= int.MinValue) {
if (Math.Floor((double)constantValue) == (double)constantValue) {
expr = new PrimitiveExpression(constantValue);
}
} else {
if ((float)constantValue >= int.MaxValue || (float)constantValue <= int.MinValue) {
if (Math.Floor((float)constantValue) == (float)constantValue) {
expr = new PrimitiveExpression(constantValue);
}
}

Loading…
Cancel
Save