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
.WithRR(new OperatorResolveResult(compilation.FindType(KnownTypeCode.Boolean), ExpressionType.Not)); .WithRR(new OperatorResolveResult(compilation.FindType(KnownTypeCode.Boolean), ExpressionType.Not));
} }
readonly HashSet<ILVariable> loadedVariablesSet = new HashSet<ILVariable>();
protected internal override TranslatedExpression VisitLdLoc(LdLoc inst) 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); return ConvertVariable(inst.Variable).WithILInstruction(inst);
} }
@ -275,7 +280,11 @@ namespace ICSharpCode.Decompiler.CSharp
protected internal override TranslatedExpression VisitStLoc(StLoc inst) 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) protected internal override TranslatedExpression VisitCeq(Ceq inst)

Loading…
Cancel
Save