Browse Source

Avoid transforming sub pattern of cpblk stackalloc initializer

pull/3380/head
Siegfried Pammer 1 year ago
parent
commit
38cdf6d50a
  1. 11
      ICSharpCode.Decompiler/IL/Transforms/TransformArrayInitializers.cs

11
ICSharpCode.Decompiler/IL/Transforms/TransformArrayInitializers.cs

@ -137,6 +137,8 @@ namespace ICSharpCode.Decompiler.IL.Transforms
return false; return false;
if (!field.HasFlag(System.Reflection.FieldAttributes.HasFieldRVA)) if (!field.HasFlag(System.Reflection.FieldAttributes.HasFieldRVA))
return false; return false;
if (IsSubPatternOfCpblkInitializer(inst))
return false;
var initialValue = field.GetInitialValue(context.PEFile, context.TypeSystem); var initialValue = field.GetInitialValue(context.PEFile, context.TypeSystem);
var elementTypeSize = elementType.GetSize(); var elementTypeSize = elementType.GetSize();
if (elementTypeSize <= 0 || initialValue.Length % elementTypeSize != 0) if (elementTypeSize <= 0 || initialValue.Length % elementTypeSize != 0)
@ -146,6 +148,13 @@ namespace ICSharpCode.Decompiler.IL.Transforms
return replacement != null; return replacement != null;
} }
private static bool IsSubPatternOfCpblkInitializer(Call inst)
{
if (inst.Parent is not AddressOf { Parent: Call { Parent: Cpblk cpblk } get_Item })
return false;
return MatchGetStaticFieldAddress(get_Item, out _);
}
private static ILInstruction DecodeArrayInitializerOrUTF8StringLiteral(StatementTransformContext context, IType elementType, BlobReader initialValue, int size) private static ILInstruction DecodeArrayInitializerOrUTF8StringLiteral(StatementTransformContext context, IType elementType, BlobReader initialValue, int size)
{ {
if (context.Settings.Utf8StringLiterals && elementType.IsKnownType(KnownTypeCode.Byte) if (context.Settings.Utf8StringLiterals && elementType.IsKnownType(KnownTypeCode.Byte)
@ -373,7 +382,7 @@ namespace ICSharpCode.Decompiler.IL.Transforms
return true; return true;
} }
bool MatchGetStaticFieldAddress(ILInstruction input, out IField field) static bool MatchGetStaticFieldAddress(ILInstruction input, out IField field)
{ {
if (input.MatchLdsFlda(out field)) if (input.MatchLdsFlda(out field))
return true; return true;

Loading…
Cancel
Save