diff --git a/ICSharpCode.Decompiler/ILAst/PeepholeTransform.cs b/ICSharpCode.Decompiler/ILAst/PeepholeTransform.cs index 3183346da..786f31b28 100644 --- a/ICSharpCode.Decompiler/ILAst/PeepholeTransform.cs +++ b/ICSharpCode.Decompiler/ILAst/PeepholeTransform.cs @@ -252,19 +252,19 @@ namespace ICSharpCode.Decompiler.ILAst return; ILInlining inlining; - ILExpression stloc2 = block.Body.ElementAtOrDefault(i + 2) as ILExpression; - if (stloc2 != null && stloc2.Code == ILCode.Stloc && stloc2.Arguments[0].Code == ILCode.Ldloc && stloc2.Arguments[0].Operand == exprVar) { + ILExpression store2 = block.Body.ElementAtOrDefault(i + 2) as ILExpression; + if (StoreCanBeConvertedToAssignment(store2, exprVar)) { // expr_44 = ... // stloc(v1, expr_44) - // stloc(v2, expr_44) + // anystore(v2, expr_44) // -> - // stloc(v1, stloc(v2, ...)) + // stloc(v1, anystore(v2, ...)) inlining = new ILInlining(method); if (inlining.numLdloc.GetOrDefault(exprVar) == 2 && inlining.numStloc.GetOrDefault(exprVar) == 1) { - block.Body.RemoveAt(i + 2); // remove stloc2 + block.Body.RemoveAt(i + 2); // remove store2 block.Body.RemoveAt(i); // remove expr = ... - stloc1.Arguments[0] = stloc2; - stloc2.Arguments[0] = initializer; + stloc1.Arguments[0] = store2; + store2.Arguments[store2.Arguments.Count - 1] = initializer; if (inlining.InlineIfPossible(block, ref i)) { i++; // retry transformations on the new combined instruction @@ -283,6 +283,14 @@ namespace ICSharpCode.Decompiler.ILAst i++; // retry transformations on the new combined instruction } } + + bool StoreCanBeConvertedToAssignment(ILExpression store, ILVariable exprVar) + { + if (store != null && (store.Code == ILCode.Stloc || store.Code == ILCode.Stfld || store.Code == ILCode.Stsfld)) { + return store.Arguments.Last().Code == ILCode.Ldloc && store.Arguments.Last().Operand == exprVar; + } + return false; + } #endregion } } diff --git a/ICSharpCode.Decompiler/ILAst/TypeAnalysis.cs b/ICSharpCode.Decompiler/ILAst/TypeAnalysis.cs index 0d75ee064..c4b834b40 100644 --- a/ICSharpCode.Decompiler/ILAst/TypeAnalysis.cs +++ b/ICSharpCode.Decompiler/ILAst/TypeAnalysis.cs @@ -219,11 +219,11 @@ namespace ICSharpCode.Decompiler.ILAst InferTypeForExpression(expr.Arguments[0], ((FieldReference)expr.Operand).DeclaringType); InferTypeForExpression(expr.Arguments[1], GetFieldType((FieldReference)expr.Operand)); } - return null; + return GetFieldType((FieldReference)expr.Operand); case ILCode.Stsfld: if (forceInferChildren) InferTypeForExpression(expr.Arguments[0], GetFieldType((FieldReference)expr.Operand)); - return null; + return GetFieldType((FieldReference)expr.Operand); #endregion #region Reference/Pointer instructions case ILCode.Ldind_I: