Browse Source

Specify more concrete types for single-use stack variables.

pull/728/head
Siegfried Pammer 9 years ago
parent
commit
8f0ecec043
  1. 11
      ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs

11
ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs

@ -258,8 +258,13 @@ namespace ICSharpCode.Decompiler.CSharp @@ -258,8 +258,13 @@ namespace ICSharpCode.Decompiler.CSharp
.WithRR(new OperatorResolveResult(compilation.FindType(KnownTypeCode.Boolean), ExpressionType.Not));
}
readonly HashSet<ILVariable> loadedVariablesSet = new HashSet<ILVariable>();
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 @@ -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)

Loading…
Cancel
Save