From e8f3e14102137461b7e0b9cd159528b7f074ae73 Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Wed, 23 Feb 2011 17:21:28 +0100 Subject: [PATCH] Fix bugs in type analysis. Closes #38. --- ICSharpCode.Decompiler/ILAst/TypeAnalysis.cs | 6 +- .../Tests/BooleanConsumedAsInteger.il | 59 +++++++++++++++++++ .../Tests/ICSharpCode.Decompiler.Tests.csproj | 7 +++ 3 files changed, 70 insertions(+), 2 deletions(-) create mode 100644 ICSharpCode.Decompiler/Tests/BooleanConsumedAsInteger.il diff --git a/ICSharpCode.Decompiler/ILAst/TypeAnalysis.cs b/ICSharpCode.Decompiler/ILAst/TypeAnalysis.cs index 6c79b565e..e7ed4a7dd 100644 --- a/ICSharpCode.Decompiler/ILAst/TypeAnalysis.cs +++ b/ICSharpCode.Decompiler/ILAst/TypeAnalysis.cs @@ -286,7 +286,9 @@ namespace Decompiler case ILCode.Ldvirtftn: return typeSystem.IntPtr; case ILCode.Ldc_I4: - return (IsIntegerOrEnum(expectedType) || IsBoolean(expectedType)) ? expectedType : typeSystem.Int32; + if (IsBoolean(expectedType) && ((int)expr.Operand == 0 || (int)expr.Operand == 1)) + return typeSystem.Boolean; + return IsIntegerOrEnum(expectedType) ? expectedType : typeSystem.Int32; case ILCode.Ldc_I8: return (IsIntegerOrEnum(expectedType)) ? expectedType : typeSystem.Int64; case ILCode.Ldc_R4: @@ -561,7 +563,7 @@ namespace Decompiler } else { left.ExpectedType = right.ExpectedType = TypeWithMoreInformation(leftPreferred, rightPreferred); left.InferredType = DoInferTypeForExpression(left, left.ExpectedType); - right.InferredType = DoInferTypeForExpression(left, right.ExpectedType); + right.InferredType = DoInferTypeForExpression(right, right.ExpectedType); return left.ExpectedType; } } diff --git a/ICSharpCode.Decompiler/Tests/BooleanConsumedAsInteger.il b/ICSharpCode.Decompiler/Tests/BooleanConsumedAsInteger.il new file mode 100644 index 000000000..9e3000279 --- /dev/null +++ b/ICSharpCode.Decompiler/Tests/BooleanConsumedAsInteger.il @@ -0,0 +1,59 @@ +.assembly extern mscorlib +{ + .publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) + .ver 4:0:0:0 +} +.assembly BooleanConsumedAsInteger +{ + .hash algorithm 0x00008004 + .ver 1:0:0:0 +} +.module BooleanConsumedAsInteger.exe +.imagebase 0x00400000 +.file alignment 0x00000200 +.stackreserve 0x00100000 +.subsystem 0x0003 // WINDOWS_CUI +.corflags 0x00000003 // ILONLY 32BITREQUIRED + +.class private auto ansi beforefieldinit BooleanConsumedAsInteger.Program extends [mscorlib]System.Object +{ + .method public hidebysig static void Main(string[] args) cil managed + { + .entrypoint + .maxstack 8 + + ret + } + + .method public hidebysig static int32 ReturnBoolAsInt() cil managed + { + ldnull + ldnull + call bool [mscorlib] System.Object::Equals(object, object) + ret + } + + .method public hidebysig static int32 BitwiseOperationOnBool() cil managed + { + ldnull + ldnull + call bool [mscorlib] System.Object::Equals(object, object) + ldc.i4 255 + and + ret + } + + .method public hidebysig specialname rtspecialname + instance void .ctor() cil managed + { + // Code size 7 (0x7) + .maxstack 8 + IL_0000: ldarg.0 + IL_0001: call instance void [mscorlib]System.Object::.ctor() + IL_0006: ret + } // end of method Program::.ctor + +} // end of class StackTests.Program + + +// ============================================================= diff --git a/ICSharpCode.Decompiler/Tests/ICSharpCode.Decompiler.Tests.csproj b/ICSharpCode.Decompiler/Tests/ICSharpCode.Decompiler.Tests.csproj index 636ea71dc..e6d805fb5 100644 --- a/ICSharpCode.Decompiler/Tests/ICSharpCode.Decompiler.Tests.csproj +++ b/ICSharpCode.Decompiler/Tests/ICSharpCode.Decompiler.Tests.csproj @@ -65,5 +65,12 @@ ICSharpCode.Decompiler + + + + + + + \ No newline at end of file