Browse Source

Use type analysis to introduce casts to float/double only where required.

pull/100/head
Daniel Grunwald 15 years ago
parent
commit
1cd79a1301
  1. 13
      ICSharpCode.Decompiler/Ast/AstMethodBodyBuilder.cs
  2. 6
      ICSharpCode.Decompiler/ILAst/TypeAnalysis.cs

13
ICSharpCode.Decompiler/Ast/AstMethodBodyBuilder.cs

@ -377,9 +377,10 @@ namespace ICSharpCode.Decompiler.Ast @@ -377,9 +377,10 @@ namespace ICSharpCode.Decompiler.Ast
}
return arg1;
}
case ILCode.Conv_R4: return arg1.CastTo(typeof(float));
case ILCode.Conv_R8: return arg1.CastTo(typeof(double));
case ILCode.Conv_R_Un: return arg1.CastTo(typeof(double)); // TODO
case ILCode.Conv_R4:
case ILCode.Conv_R8:
case ILCode.Conv_R_Un: // TODO
return arg1;
case ILCode.Conv_Ovf_I1:
case ILCode.Conv_Ovf_I2:
case ILCode.Conv_Ovf_I4:
@ -908,8 +909,10 @@ namespace ICSharpCode.Decompiler.Ast @@ -908,8 +909,10 @@ namespace ICSharpCode.Decompiler.Ast
{
return expr.CastTo(AstBuilder.ConvertType(actualType));
}
if (actualIsIntegerOrEnum && requiredIsIntegerOrEnum) {
bool actualIsPrimitiveType = actualIsIntegerOrEnum || actualType.MetadataType == MetadataType.Single || actualType.MetadataType == MetadataType.Double;
bool requiredIsPrimitiveType = requiredIsIntegerOrEnum || reqType.MetadataType == MetadataType.Single || reqType.MetadataType == MetadataType.Double;
if (actualIsPrimitiveType && requiredIsPrimitiveType) {
if (actualType.FullName == reqType.FullName)
return expr;
return expr.CastTo(AstBuilder.ConvertType(reqType));

6
ICSharpCode.Decompiler/ILAst/TypeAnalysis.cs

@ -604,8 +604,14 @@ namespace ICSharpCode.Decompiler.ILAst @@ -604,8 +604,14 @@ namespace ICSharpCode.Decompiler.ILAst
case ILCode.Conv_Ovf_U_Un:
return HandleConversion(NativeInt, false, expr.Arguments[0], expectedType, typeSystem.UIntPtr);
case ILCode.Conv_R4:
if (forceInferChildren) {
InferTypeForExpression(expr.Arguments[0], typeSystem.Single);
}
return typeSystem.Single;
case ILCode.Conv_R8:
if (forceInferChildren) {
InferTypeForExpression(expr.Arguments[0], typeSystem.Double);
}
return typeSystem.Double;
case ILCode.Conv_R_Un:
return (expectedType != null && expectedType.MetadataType == MetadataType.Single) ? typeSystem.Single : typeSystem.Double;

Loading…
Cancel
Save