From 8f0ecec043a5d470dccd4f81cbab5cfa3d8fb1d5 Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Sun, 19 Jun 2016 21:25:05 +0900 Subject: [PATCH] Specify more concrete types for single-use stack variables. --- ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs b/ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs index 4f6c0df01..756cd673f 100644 --- a/ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs +++ b/ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs @@ -258,8 +258,13 @@ namespace ICSharpCode.Decompiler.CSharp .WithRR(new OperatorResolveResult(compilation.FindType(KnownTypeCode.Boolean), ExpressionType.Not)); } + readonly HashSet loadedVariablesSet = new HashSet(); + protected internal override TranslatedExpression VisitLdLoc(LdLoc inst) { + if (inst.Variable.Kind == VariableKind.StackSlot && inst.Variable.IsSingleDefinition) { + loadedVariablesSet.Add(inst.Variable); + } return ConvertVariable(inst.Variable).WithILInstruction(inst); } @@ -275,7 +280,11 @@ namespace ICSharpCode.Decompiler.CSharp protected internal override TranslatedExpression VisitStLoc(StLoc inst) { - return Assignment(ConvertVariable(inst.Variable).WithoutILInstruction(), Translate(inst.Value)).WithILInstruction(inst); + var translatedValue = Translate(inst.Value); + if (inst.Variable.Kind == VariableKind.StackSlot && inst.Variable.IsSingleDefinition && !loadedVariablesSet.Contains(inst.Variable)) { + inst.Variable.Type = translatedValue.Type; + } + return Assignment(ConvertVariable(inst.Variable).WithoutILInstruction(), translatedValue).WithILInstruction(inst); } protected internal override TranslatedExpression VisitCeq(Ceq inst)