From 38cdf6d50afda104fe87b4e34389a3ba9626a246 Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Sat, 22 Feb 2025 11:09:47 +0100 Subject: [PATCH] Avoid transforming sub pattern of cpblk stackalloc initializer --- .../IL/Transforms/TransformArrayInitializers.cs | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/ICSharpCode.Decompiler/IL/Transforms/TransformArrayInitializers.cs b/ICSharpCode.Decompiler/IL/Transforms/TransformArrayInitializers.cs index 65d9d05e0..7a45440b0 100644 --- a/ICSharpCode.Decompiler/IL/Transforms/TransformArrayInitializers.cs +++ b/ICSharpCode.Decompiler/IL/Transforms/TransformArrayInitializers.cs @@ -137,6 +137,8 @@ namespace ICSharpCode.Decompiler.IL.Transforms return false; if (!field.HasFlag(System.Reflection.FieldAttributes.HasFieldRVA)) return false; + if (IsSubPatternOfCpblkInitializer(inst)) + return false; var initialValue = field.GetInitialValue(context.PEFile, context.TypeSystem); var elementTypeSize = elementType.GetSize(); if (elementTypeSize <= 0 || initialValue.Length % elementTypeSize != 0) @@ -146,6 +148,13 @@ namespace ICSharpCode.Decompiler.IL.Transforms 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) { if (context.Settings.Utf8StringLiterals && elementType.IsKnownType(KnownTypeCode.Byte) @@ -373,7 +382,7 @@ namespace ICSharpCode.Decompiler.IL.Transforms return true; } - bool MatchGetStaticFieldAddress(ILInstruction input, out IField field) + static bool MatchGetStaticFieldAddress(ILInstruction input, out IField field) { if (input.MatchLdsFlda(out field)) return true;