Browse Source

Add test and fix for conv.i/conv.u casts

pull/728/head
Siegfried Pammer 9 years ago
parent
commit
a0f52e1185
  1. 6
      ICSharpCode.Decompiler/CSharp/TranslatedExpression.cs
  2. 2
      ICSharpCode.Decompiler/Tests/ICSharpCode.Decompiler.Tests.csproj
  3. 44
      ICSharpCode.Decompiler/Tests/TestCases/ConvTest.il
  4. 11
      ICSharpCode.Decompiler/Tests/TestRunner.cs

6
ICSharpCode.Decompiler/CSharp/TranslatedExpression.cs

@ -167,6 +167,12 @@ namespace ICSharpCode.Decompiler.CSharp
.WithRR(new ResolveResult(new PointerType(expressionBuilder.compilation.FindType(KnownTypeCode.Void)))) .WithRR(new ResolveResult(new PointerType(expressionBuilder.compilation.FindType(KnownTypeCode.Void))))
.ConvertTo(targetType, expressionBuilder); .ConvertTo(targetType, expressionBuilder);
} }
if (targetType.IsKnownType(KnownTypeCode.IntPtr) || targetType.IsKnownType(KnownTypeCode.UIntPtr)) {
return Expression.CastTo(expressionBuilder.ConvertType(new PointerType(expressionBuilder.compilation.FindType(KnownTypeCode.Void))))
.CastTo(expressionBuilder.ConvertType(targetType))
.WithoutILInstruction()
.WithRR(expressionBuilder.resolver.WithCheckForOverflow(checkForOverflow).ResolveCast(targetType, ResolveResult));
}
if (type.Kind == TypeKind.ByReference && targetType.Kind == TypeKind.Pointer && Expression is DirectionExpression) { if (type.Kind == TypeKind.ByReference && targetType.Kind == TypeKind.Pointer && Expression is DirectionExpression) {
// convert from reference to pointer // convert from reference to pointer
Expression arg = ((DirectionExpression)Expression).Expression.Detach(); Expression arg = ((DirectionExpression)Expression).Expression.Detach();

2
ICSharpCode.Decompiler/Tests/ICSharpCode.Decompiler.Tests.csproj

@ -89,6 +89,8 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<None Include="packages.config" /> <None Include="packages.config" />
<None Include="TestCases\ConvTest.il" />
<None Include="TestCases\ILTest.il" />
<None Include="TestCases\Readme.txt" /> <None Include="TestCases\Readme.txt" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

44
ICSharpCode.Decompiler/Tests/TestCases/ConvTest.il

@ -0,0 +1,44 @@
.assembly extern mscorlib
{
.publickeytoken = (
b7 7a 5c 56 19 34 e0 89
)
.ver 4:0:0:0
}
.assembly 'ConvTest'
{
.ver 0:0:0:0
}
.module ConvTest.exe
// MVID: {987E1A15-519A-400C-B879-759CFB7F990B}
.corflags 0x00000001 // ILOnly
.class private auto ansi abstract sealed beforefieldinit Program
extends [mscorlib]System.Object
{
.method public hidebysig static void Print (native int) cil managed {
ldarg.0
box [mscorlib]System.IntPtr
call void [mscorlib]System.Console::WriteLine(object)
ret
}
.method public hidebysig static void Main (string[] args) cil managed {
.entrypoint
.try {
ldc.i4.0
call void Program::Print(native int)
ldc.i8 7595444518666557374
conv.i
call void Program::Print(native int)
leave.s eof
} catch [mscorlib]System.Exception {
callvirt instance string [mscorlib]System.Object::ToString()
call void [mscorlib]System.Console::WriteLine(object)
leave.s eof
}
eof: ret
}
}

11
ICSharpCode.Decompiler/Tests/TestRunner.cs

@ -113,6 +113,13 @@ namespace ICSharpCode.Decompiler.Tests
{ {
TestAssembleDecompileCompileOutput("ILTest.il"); TestAssembleDecompileCompileOutput("ILTest.il");
} }
[Test]
public void ConvTest()
{
TestAssembleDecompileCompileOutput("ConvTest.il");
TestAssembleDecompileCompileOutput("ConvTest.il", CompilerOptions.UseDebug | CompilerOptions.Force32Bit, AssemblerOptions.Force32Bit);
}
[Test, Ignore("Fixed statements are broken")] [Test, Ignore("Fixed statements are broken")]
public void UnsafeCode() public void UnsafeCode()
@ -150,13 +157,13 @@ namespace ICSharpCode.Decompiler.Tests
} }
} }
void TestAssembleDecompileCompileOutput(string testFileName, CompilerOptions options = CompilerOptions.UseDebug) void TestAssembleDecompileCompileOutput(string testFileName, CompilerOptions options = CompilerOptions.UseDebug, AssemblerOptions asmOptions = AssemblerOptions.None)
{ {
string outputFile = null; string outputFile = null;
CompilerResults decompiledOutputFile = null; CompilerResults decompiledOutputFile = null;
try { try {
outputFile = Tester.AssembleIL(Path.Combine(TestCasePath, testFileName)); outputFile = Tester.AssembleIL(Path.Combine(TestCasePath, testFileName), asmOptions);
string decompiledCodeFile = Tester.DecompileCSharp(outputFile); string decompiledCodeFile = Tester.DecompileCSharp(outputFile);
decompiledOutputFile = Tester.CompileCSharp(decompiledCodeFile, options); decompiledOutputFile = Tester.CompileCSharp(decompiledCodeFile, options);

Loading…
Cancel
Save