Skip to content

Commit

Permalink
Fix #1429: Optimize ExpressionBuilder.TranslateArrayInitializer by ap…
Browse files Browse the repository at this point in the history
…plying optimizations suggested in #1202.
  • Loading branch information
siegfriedpammer committed Feb 20, 2019
1 parent 0758c7e commit 27efe1b
Showing 1 changed file with 28 additions and 7 deletions.
35 changes: 28 additions & 7 deletions ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2263,6 +2263,19 @@ TranslatedExpression MakeInitializerAssignment(InitializedObjectResolveResult rr
}
}

class ArrayInitializer
{
public ArrayInitializer(ArrayInitializerExpression expression)
{
this.Expression = expression;
this.CurrentElementCount = 0;
}

public ArrayInitializerExpression Expression;
// HACK: avoid using Expression.Elements.Count: https://github.com/icsharpcode/ILSpy/issues/1202
public int CurrentElementCount;
}

TranslatedExpression TranslateArrayInitializer(Block block)
{
var stloc = block.Instructions.FirstOrDefault() as StLoc;
Expand All @@ -2278,8 +2291,8 @@ TranslatedExpression TranslateArrayInitializer(Block block)
throw new ArgumentException("given Block is invalid!");
int dimensions = newArr.Indices.Count;
int[] dimensionSizes = translatedDimensions.Select(dim => (int)dim.ResolveResult.ConstantValue).ToArray();
var container = new Stack<ArrayInitializerExpression>();
var root = new ArrayInitializerExpression();
var container = new Stack<ArrayInitializer>();
var root = new ArrayInitializer(new ArrayInitializerExpression());
container.Push(root);
var elementResolveResults = new List<ResolveResult>();

Expand All @@ -2295,8 +2308,12 @@ TranslatedExpression TranslateArrayInitializer(Block block)
throw new ArgumentException("given Block is invalid!");
while (container.Count < dimensions) {
var aie = new ArrayInitializerExpression();
container.Peek().Elements.Add(aie);
container.Push(aie);
var parentInitializer = container.Peek();
if (parentInitializer.CurrentElementCount > 0)
parentInitializer.Expression.AddChild(new CSharpTokenNode(TextLocation.Empty, Roles.Comma), Roles.Comma);
parentInitializer.Expression.Elements.Add(aie);
parentInitializer.CurrentElementCount++;
container.Push(new ArrayInitializer(aie));
}
TranslatedExpression val;
var old = astBuilder.UseSpecialConstants;
Expand All @@ -2306,9 +2323,13 @@ TranslatedExpression TranslateArrayInitializer(Block block)
} finally {
astBuilder.UseSpecialConstants = old;
}
container.Peek().Elements.Add(val);
var currentInitializer = container.Peek();
if (currentInitializer.CurrentElementCount > 0)
currentInitializer.Expression.AddChild(new CSharpTokenNode(TextLocation.Empty, Roles.Comma), Roles.Comma);
currentInitializer.Expression.Elements.Add(val);
currentInitializer.CurrentElementCount++;
elementResolveResults.Add(val.ResolveResult);
while (container.Count > 0 && container.Peek().Elements.Count == dimensionSizes[container.Count - 1]) {
while (container.Count > 0 && container.Peek().CurrentElementCount == dimensionSizes[container.Count - 1]) {
container.Pop();
}
}
Expand All @@ -2328,7 +2349,7 @@ TranslatedExpression TranslateArrayInitializer(Block block)
}
var expr = new ArrayCreateExpression {
Type = typeExpression,
Initializer = root
Initializer = root.Expression
};
expr.AdditionalArraySpecifiers.AddRange(additionalSpecifiers);
if (!type.ContainsAnonymousType())
Expand Down

0 comments on commit 27efe1b

Please sign in to comment.