diff --git a/ICSharpCode.Decompiler/ILAst/ILAstOptimizer.cs b/ICSharpCode.Decompiler/ILAst/ILAstOptimizer.cs index ca9041e1b..051662f35 100644 --- a/ICSharpCode.Decompiler/ILAst/ILAstOptimizer.cs +++ b/ICSharpCode.Decompiler/ILAst/ILAstOptimizer.cs @@ -851,5 +851,16 @@ namespace ICSharpCode.Decompiler.ILAst if (!collection.Remove(key)) throw new Exception("The key was not found in the dictionary"); } + + public static bool ContainsReferenceTo(this ILExpression expr, ILVariable v) + { + if (expr.Operand == v) + return true; + foreach (var arg in expr.Arguments) { + if (ContainsReferenceTo(arg, v)) + return true; + } + return false; + } } } diff --git a/ICSharpCode.Decompiler/ILAst/InitializerPeepholeTransforms.cs b/ICSharpCode.Decompiler/ILAst/InitializerPeepholeTransforms.cs index 00a64c96e..373a7ca43 100644 --- a/ICSharpCode.Decompiler/ILAst/InitializerPeepholeTransforms.cs +++ b/ICSharpCode.Decompiler/ILAst/InitializerPeepholeTransforms.cs @@ -63,7 +63,9 @@ namespace ICSharpCode.Decompiler.ILAst v == v3 && nextExpr.Arguments[1].Match(ILCode.Ldc_I4, out arrayPos) && arrayPos >= operands.Count && - arrayPos <= operands.Count + maxConsecutiveDefaultValueExpressions) { + arrayPos <= operands.Count + maxConsecutiveDefaultValueExpressions && + !nextExpr.Arguments[2].ContainsReferenceTo(v3)) + { while (operands.Count < arrayPos) operands.Add(new ILExpression(ILCode.DefaultValue, elementType)); operands.Add(nextExpr.Arguments[2]); diff --git a/ICSharpCode.Decompiler/Tests/InitializerTests.cs b/ICSharpCode.Decompiler/Tests/InitializerTests.cs index 2f17c2976..29e3d1d59 100644 --- a/ICSharpCode.Decompiler/Tests/InitializerTests.cs +++ b/ICSharpCode.Decompiler/Tests/InitializerTests.cs @@ -353,6 +353,15 @@ public class InitializerTests InitializerTests.MyEnum.b }); } + + public static void RecursiveArrayInitializer() + { + int[] array = new int[3]; + array[0] = 1; + array[1] = 2; + array[2] = array[1] + 1; + array[0] = 0; + } #endregion public static void CollectionInitializerList() @@ -365,6 +374,13 @@ public class InitializerTests }); } + public static object RecursiveCollectionInitializer() + { + List list = new List(); + list.Add(list); + return list; + } + public static void CollectionInitializerDictionary() { InitializerTests.X(InitializerTests.Y(), new Dictionary diff --git a/ILSpy/TextView/DecompilerTextView.cs b/ILSpy/TextView/DecompilerTextView.cs index c3c8d1ab6..49ffb1d2a 100644 --- a/ILSpy/TextView/DecompilerTextView.cs +++ b/ILSpy/TextView/DecompilerTextView.cs @@ -727,7 +727,7 @@ namespace ICSharpCode.ILSpy.TextView output.AddButton(null, "Open Explorer", delegate { Process.Start("explorer", "/select,\"" + fileName + "\""); }); output.WriteLine(); tcs.SetResult(output); - } catch (OperationCanceledException ex) { + } catch (OperationCanceledException) { tcs.SetCanceled(); #if DEBUG } catch (AggregateException ex) {