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. 11
      ICSharpCode.Decompiler/Ast/AstMethodBodyBuilder.cs
  2. 6
      ICSharpCode.Decompiler/ILAst/TypeAnalysis.cs

11
ICSharpCode.Decompiler/Ast/AstMethodBodyBuilder.cs

@ -377,9 +377,10 @@ namespace ICSharpCode.Decompiler.Ast
} }
return arg1; return arg1;
} }
case ILCode.Conv_R4: return arg1.CastTo(typeof(float)); case ILCode.Conv_R4:
case ILCode.Conv_R8: return arg1.CastTo(typeof(double)); case ILCode.Conv_R8:
case ILCode.Conv_R_Un: return arg1.CastTo(typeof(double)); // TODO case ILCode.Conv_R_Un: // TODO
return arg1;
case ILCode.Conv_Ovf_I1: case ILCode.Conv_Ovf_I1:
case ILCode.Conv_Ovf_I2: case ILCode.Conv_Ovf_I2:
case ILCode.Conv_Ovf_I4: case ILCode.Conv_Ovf_I4:
@ -909,7 +910,9 @@ namespace ICSharpCode.Decompiler.Ast
return expr.CastTo(AstBuilder.ConvertType(actualType)); 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) if (actualType.FullName == reqType.FullName)
return expr; return expr;
return expr.CastTo(AstBuilder.ConvertType(reqType)); return expr.CastTo(AstBuilder.ConvertType(reqType));

6
ICSharpCode.Decompiler/ILAst/TypeAnalysis.cs

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

Loading…
Cancel
Save