Browse Source

Implement InferType() for ldelema.

This improves decompilation of compound assignment on array elements.
pull/1129/head
Daniel Grunwald 7 years ago
parent
commit
0552b335c9
  1. 2
      ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs
  2. 8
      ICSharpCode.Decompiler/IL/ILTypeExtensions.cs

2
ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs

@ -1775,7 +1775,7 @@ namespace ICSharpCode.Decompiler.CSharp @@ -1775,7 +1775,7 @@ namespace ICSharpCode.Decompiler.CSharp
{
TranslatedExpression arrayExpr = Translate(inst.Array);
var arrayType = arrayExpr.Type as ArrayType;
if (arrayType == null) {
if (arrayType == null || !TypeUtils.IsCompatibleTypeForMemoryAccess(new ByReferenceType(arrayType.ElementType), inst.Type)) {
arrayType = new ArrayType(compilation, inst.Type, inst.Indices.Count);
arrayExpr = arrayExpr.ConvertTo(arrayType, this);
}

8
ICSharpCode.Decompiler/IL/ILTypeExtensions.cs

@ -163,6 +163,14 @@ namespace ICSharpCode.Decompiler.IL @@ -163,6 +163,14 @@ namespace ICSharpCode.Decompiler.IL
return new TypeSystem.ByReferenceType(ldflda.Field.Type);
case LdsFlda ldsflda:
return new TypeSystem.ByReferenceType(ldsflda.Field.Type);
case LdElema ldelema:
if (ldelema.Array.InferType() is TypeSystem.ArrayType arrayType) {
var refType = new TypeSystem.ByReferenceType(arrayType.ElementType);
if (TypeUtils.IsCompatibleTypeForMemoryAccess(refType, ldelema.Type)) {
return refType;
}
}
return new TypeSystem.ByReferenceType(ldelema.Type);
default:
return SpecialType.UnknownType;
}

Loading…
Cancel
Save