Browse Source

use ConvertTo with Conv-instructions

pull/728/head
Siegfried Pammer 9 years ago
parent
commit
6a62b24cce
  1. 7
      ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs
  2. 6
      ICSharpCode.Decompiler/CSharp/TranslatedExpression.cs

7
ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs

@ -551,14 +551,13 @@ namespace ICSharpCode.Decompiler.CSharp @@ -551,14 +551,13 @@ namespace ICSharpCode.Decompiler.CSharp
arg = arg.ConvertTo(compilation.FindType(inputType), this);
}
var targetType = compilation.FindType(inst.TargetType.ToKnownTypeCode());
var rr = resolver.WithCheckForOverflow(inst.CheckForOverflow).ResolveCast(targetType, arg.ResolveResult);
Expression castExpr = new CastExpression(ConvertType(targetType), arg.Expression);
ExpressionWithResolveResult castExpr = arg.ConvertTo(targetType, this, inst.CheckForOverflow, addUncheckedAnnotations: false);
if (inst.Kind == ConversionKind.Nop || inst.Kind == ConversionKind.Truncate || inst.Kind == ConversionKind.FloatToInt
|| (inst.Kind == ConversionKind.ZeroExtend && arg.Type.GetSign() == Sign.Signed))
{
castExpr.AddAnnotation(inst.CheckForOverflow ? AddCheckedBlocks.CheckedAnnotation : AddCheckedBlocks.UncheckedAnnotation);
castExpr.Expression.AddAnnotation(inst.CheckForOverflow ? AddCheckedBlocks.CheckedAnnotation : AddCheckedBlocks.UncheckedAnnotation);
}
return castExpr.WithILInstruction(inst).WithRR(rr);
return castExpr.WithILInstruction(inst);
}
protected internal override TranslatedExpression VisitCall(Call inst)

6
ICSharpCode.Decompiler/CSharp/TranslatedExpression.cs

@ -153,7 +153,7 @@ namespace ICSharpCode.Decompiler.CSharp @@ -153,7 +153,7 @@ namespace ICSharpCode.Decompiler.CSharp
throw new ArgumentException("descendant must be a descendant of the current node");
}
public TranslatedExpression ConvertTo(IType targetType, ExpressionBuilder expressionBuilder)
public TranslatedExpression ConvertTo(IType targetType, ExpressionBuilder expressionBuilder, bool checkForOverflow = false, bool addUncheckedAnnotations = true)
{
var type = this.Type;
if (targetType.IsKnownType(KnownTypeCode.Boolean))
@ -177,7 +177,7 @@ namespace ICSharpCode.Decompiler.CSharp @@ -177,7 +177,7 @@ namespace ICSharpCode.Decompiler.CSharp
// perform remaining pointer cast, if necessary
return pointerExpr.ConvertTo(targetType, expressionBuilder);
}
if (type.IsKnownType(KnownTypeCode.Boolean) && targetType.GetStackType() == StackType.I4) {
if (type.IsKnownType(KnownTypeCode.Boolean) && targetType.GetStackType().IsIntegerType()) {
// convert from boolean to integer (or enum)
return new ConditionalExpression(
this.Expression,
@ -185,7 +185,7 @@ namespace ICSharpCode.Decompiler.CSharp @@ -185,7 +185,7 @@ namespace ICSharpCode.Decompiler.CSharp
LdcI4(expressionBuilder.compilation, 0).ConvertTo(targetType, expressionBuilder)
).WithoutILInstruction().WithRR(new ResolveResult(targetType));
}
var rr = expressionBuilder.resolver.ResolveCast(targetType, ResolveResult);
var rr = expressionBuilder.resolver.WithCheckForOverflow(checkForOverflow).ResolveCast(targetType, ResolveResult);
if (rr.IsCompileTimeConstant && !rr.IsError) {
return expressionBuilder.ConvertConstantValue(rr)
.WithILInstruction(this.ILInstructions);

Loading…
Cancel
Save