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 @@ -167,6 +167,12 @@ namespace ICSharpCode.Decompiler.CSharp
.WithRR(new ResolveResult(new PointerType(expressionBuilder.compilation.FindType(KnownTypeCode.Void))))
.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) {
// convert from reference to pointer
Expression arg = ((DirectionExpression)Expression).Expression.Detach();

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

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

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

@ -0,0 +1,44 @@ @@ -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 @@ -113,6 +113,13 @@ namespace ICSharpCode.Decompiler.Tests
{
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")]
public void UnsafeCode()
@ -150,13 +157,13 @@ namespace ICSharpCode.Decompiler.Tests @@ -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;
CompilerResults decompiledOutputFile = null;
try {
outputFile = Tester.AssembleIL(Path.Combine(TestCasePath, testFileName));
outputFile = Tester.AssembleIL(Path.Combine(TestCasePath, testFileName), asmOptions);
string decompiledCodeFile = Tester.DecompileCSharp(outputFile);
decompiledOutputFile = Tester.CompileCSharp(decompiledCodeFile, options);

Loading…
Cancel
Save