From 55b89bdd770c43586544e7df607959b6c8e4b22b Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Sun, 12 Jun 2016 08:20:13 +0900 Subject: [PATCH] force int/long cast on array access --- ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs b/ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs index 673320f1b..3fe137597 100644 --- a/ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs +++ b/ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs @@ -766,12 +766,18 @@ namespace ICSharpCode.Decompiler.CSharp arrayType = new ArrayType(compilation, inst.Type, inst.Indices.Count); arrayExpr = arrayExpr.ConvertTo(arrayType, this); } - TranslatedExpression expr = new IndexerExpression(arrayExpr, inst.Indices.Select(i => Translate(i).Expression)) + TranslatedExpression expr = new IndexerExpression(arrayExpr, inst.Indices.Select(TranslateArrayIndex)) .WithILInstruction(inst).WithRR(new ResolveResult(arrayType.ElementType)); return new DirectionExpression(FieldDirection.Ref, expr) .WithoutILInstruction().WithRR(new ResolveResult(new ByReferenceType(expr.Type))); } + Expression TranslateArrayIndex(ILInstruction i) + { + var stackType = i.ResultType == StackType.I4 ? KnownTypeCode.Int32 : KnownTypeCode.Int64; + return Translate(i).ConvertTo(compilation.FindType(stackType), this).Expression; + } + protected internal override TranslatedExpression VisitUnboxAny(UnboxAny inst) { var arg = Translate(inst.Argument);