Browse Source

Handle enums in GetStackType() for cecil TypeReference. Add C# translation for the 'void' opcode.

pull/728/head
Daniel Grunwald 11 years ago
parent
commit
f2d5aa2c99
  1. 2
      ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs
  2. 5
      ICSharpCode.Decompiler/CSharp/StatementBuilder.cs
  3. 1
      ICSharpCode.Decompiler/IL/ILReader.cs
  4. 7
      ICSharpCode.Decompiler/IL/ILTypeExtensions.cs
  5. 7
      ICSharpCode.Decompiler/IL/Instructions/IfInstruction.cs

2
ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs

@ -81,6 +81,8 @@ namespace ICSharpCode.Decompiler.CSharp @@ -81,6 +81,8 @@ namespace ICSharpCode.Decompiler.CSharp
{
if (Type.IsKnownType(KnownTypeCode.Boolean) || Type.Kind == TypeKind.Unknown)
return Expression;
else if (Expression is PrimitiveExpression && Type.IsKnownType(KnownTypeCode.Int32))
return new PrimitiveExpression((int)((PrimitiveExpression)Expression).Value != 0);
else if (Type.Kind == TypeKind.Pointer)
return new BinaryOperatorExpression(Expression, BinaryOperatorType.InEquality, new NullReferenceExpression());
else

5
ICSharpCode.Decompiler/CSharp/StatementBuilder.cs

@ -58,6 +58,11 @@ namespace ICSharpCode.Decompiler.CSharp @@ -58,6 +58,11 @@ namespace ICSharpCode.Decompiler.CSharp
{
return new EmptyStatement();
}
protected internal override Statement VisitVoid(ICSharpCode.Decompiler.IL.Void inst)
{
return new ExpressionStatement(exprBuilder.Convert(inst.Argument));
}
protected internal override Statement VisitIfInstruction(IfInstruction inst)
{

1
ICSharpCode.Decompiler/IL/ILReader.cs

@ -120,6 +120,7 @@ namespace ICSharpCode.Decompiler.IL @@ -120,6 +120,7 @@ namespace ICSharpCode.Decompiler.IL
if (outputStacks != null)
outputStacks.Add(start, stack.ToImmutableArray());
ILInstruction decodedInstruction = DecodeInstruction();
decodedInstruction.CheckInvariant();
if (decodedInstruction.ResultType != StackType.Void)
stack.Push(decodedInstruction.ResultType);
decodedInstruction.ILRange = new Interval(start, reader.Position);

7
ICSharpCode.Decompiler/IL/ILTypeExtensions.cs

@ -45,7 +45,12 @@ namespace ICSharpCode.Decompiler.IL @@ -45,7 +45,12 @@ namespace ICSharpCode.Decompiler.IL
public static StackType GetStackType(this TypeReference typeRef)
{
return typeRef.SkipModifiers().MetadataType.GetStackType();
typeRef = typeRef.SkipModifiers();
TypeDefinition typeDef = typeRef.Resolve();
if (typeDef != null && typeDef.IsEnum) {
typeRef = typeDef.GetEnumUnderlyingType();
}
return typeRef.MetadataType.GetStackType();
}
public static TypeReference SkipModifiers(this TypeReference typeRef)

7
ICSharpCode.Decompiler/IL/Instructions/IfInstruction.cs

@ -18,6 +18,7 @@ @@ -18,6 +18,7 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
namespace ICSharpCode.Decompiler.IL
{
@ -30,6 +31,12 @@ namespace ICSharpCode.Decompiler.IL @@ -30,6 +31,12 @@ namespace ICSharpCode.Decompiler.IL
this.FalseInst = falseInst ?? new Nop();
}
internal override void CheckInvariant()
{
base.CheckInvariant();
Debug.Assert(condition.ResultType == StackType.I4);
}
public override StackType ResultType {
get {
return CommonResultType(trueInst.ResultType, falseInst.ResultType);

Loading…
Cancel
Save