Browse Source

Adapt TranslateArrayInitializer to BlockType change

pull/728/merge
Siegfried Pammer 9 years ago
parent
commit
ae7dd7c431
  1. 32
      ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs

32
ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs

@ -1287,29 +1287,27 @@ namespace ICSharpCode.Decompiler.CSharp @@ -1287,29 +1287,27 @@ namespace ICSharpCode.Decompiler.CSharp
protected internal override TranslatedExpression VisitBlock(Block block)
{
TranslatedExpression expr;
if (TranslateArrayInitializer(block, out expr))
return expr;
return base.VisitBlock(block);
switch (block.Type) {
case BlockType.ArrayInitializer:
return TranslateArrayInitializer(block);
default:
return base.VisitBlock(block);
}
}
bool TranslateArrayInitializer(Block block, out TranslatedExpression result)
TranslatedExpression TranslateArrayInitializer(Block block)
{
result = default(TranslatedExpression);
var stloc = block.Instructions.FirstOrDefault() as StLoc;
var final = block.FinalInstruction as LdLoc;
IType type;
if (stloc == null || final == null || !stloc.Value.MatchNewArr(out type))
return false;
if (stloc.Variable != final.Variable)
return false;
if (stloc == null || final == null || !stloc.Value.MatchNewArr(out type) || stloc.Variable != final.Variable)
throw new ArgumentException("given Block is invalid!");
var newArr = (NewArr)stloc.Value;
var translatedDimensions = newArr.Indices.Select(i => Translate(i)).ToArray();
if (!translatedDimensions.All(dim => dim.ResolveResult.IsCompileTimeConstant))
return false;
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>();
@ -1322,11 +1320,11 @@ namespace ICSharpCode.Decompiler.CSharp @@ -1322,11 +1320,11 @@ namespace ICSharpCode.Decompiler.CSharp
IType t;
ILVariable v;
if (!block.Instructions[i].MatchStObj(out target, out value, out t) || !type.Equals(t))
return false;
throw new ArgumentException("given Block is invalid!");
if (!target.MatchLdElema(out t, out array) || !type.Equals(t))
return false;
throw new ArgumentException("given Block is invalid!");
if (!array.MatchLdLoc(out v) || v != final.Variable)
return false;
throw new ArgumentException("given Block is invalid!");
while (container.Count < dimensions) {
var aie = new ArrayInitializerExpression();
container.Peek().Elements.Add(aie);
@ -1353,10 +1351,8 @@ namespace ICSharpCode.Decompiler.CSharp @@ -1353,10 +1351,8 @@ namespace ICSharpCode.Decompiler.CSharp
};
expr.AdditionalArraySpecifiers.AddRange(additionalSpecifiers);
expr.Arguments.AddRange(newArr.Indices.Select(i => Translate(i).Expression));
result = expr.WithILInstruction(block)
return expr.WithILInstruction(block)
.WithRR(new ArrayCreateResolveResult(new ArrayType(compilation, type, dimensions), newArr.Indices.Select(i => Translate(i).ResolveResult).ToArray(), elementResolveResults));
return true;
}
protected internal override TranslatedExpression VisitIfInstruction(IfInstruction inst)

Loading…
Cancel
Save