Skip to content

Commit bd0fd8d

Browse files
Small refactorings:
- extract common code - reduce nesting
1 parent b0d6fa2 commit bd0fd8d

File tree

1 file changed

+37
-53
lines changed

1 file changed

+37
-53
lines changed

ICSharpCode.Decompiler/IL/Transforms/TransformArrayInitializers.cs

Lines changed: 37 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -119,62 +119,48 @@ internal static bool TransformSpanTArrayInitialization(NewObj inst, StatementTra
119119
replacement = null;
120120
if (!context.Settings.ArrayInitializers)
121121
return false;
122-
if (MatchSpanTCtorWithPointerAndSize(inst, context, out var elementType, out var field, out var size))
123-
{
124-
if (field.HasFlag(System.Reflection.FieldAttributes.HasFieldRVA))
125-
{
126-
var valuesList = new List<ILInstruction>();
127-
var initialValue = field.GetInitialValue(context.PEFile, context.TypeSystem);
128-
if (context.Settings.Utf8StringLiterals &&
129-
elementType.IsKnownType(KnownTypeCode.Byte) &&
130-
DecodeUTF8String(initialValue, size, out string text))
131-
{
132-
replacement = new LdStrUtf8(text);
133-
return true;
134-
}
135-
if (DecodeArrayInitializer(elementType, initialValue, new[] { size }, valuesList))
136-
{
137-
var tempStore = context.Function.RegisterVariable(VariableKind.InitializerTarget, new ArrayType(context.TypeSystem, elementType));
138-
replacement = BlockFromInitializer(tempStore, elementType, new[] { size }, valuesList.ToArray());
139-
return true;
140-
}
141-
}
142-
}
143-
return false;
122+
if (!MatchSpanTCtorWithPointerAndSize(inst, context, out var elementType, out var field, out var size))
123+
return false;
124+
if (!field.HasFlag(System.Reflection.FieldAttributes.HasFieldRVA))
125+
return false;
126+
var initialValue = field.GetInitialValue(context.PEFile, context.TypeSystem);
127+
replacement = DecodeArrayInitializerOrUTF8StringLiteral(context, elementType, initialValue, size);
128+
return replacement != null;
144129
}
145130

146131
internal static bool TransformRuntimeHelpersCreateSpanInitialization(Call inst, StatementTransformContext context, out ILInstruction replacement)
147132
{
148133
replacement = null;
149134
if (!context.Settings.ArrayInitializers)
150135
return false;
151-
if (MatchRuntimeHelpersCreateSpan(inst, context, out var elementType, out var field))
152-
{
153-
if (field.HasFlag(System.Reflection.FieldAttributes.HasFieldRVA))
154-
{
155-
var valuesList = new List<ILInstruction>();
156-
var initialValue = field.GetInitialValue(context.PEFile, context.TypeSystem);
157-
var elementTypeSize = elementType.GetSize();
158-
if (elementTypeSize <= 0 || initialValue.Length % elementTypeSize != 0)
159-
return false;
136+
if (!MatchRuntimeHelpersCreateSpan(inst, context, out var elementType, out var field))
137+
return false;
138+
if (!field.HasFlag(System.Reflection.FieldAttributes.HasFieldRVA))
139+
return false;
140+
var initialValue = field.GetInitialValue(context.PEFile, context.TypeSystem);
141+
var elementTypeSize = elementType.GetSize();
142+
if (elementTypeSize <= 0 || initialValue.Length % elementTypeSize != 0)
143+
return false;
144+
var size = initialValue.Length / elementTypeSize;
145+
replacement = DecodeArrayInitializerOrUTF8StringLiteral(context, elementType, initialValue, size);
146+
return replacement != null;
147+
}
160148

161-
var size = initialValue.Length / elementTypeSize;
162-
if (context.Settings.Utf8StringLiterals &&
163-
elementType.IsKnownType(KnownTypeCode.Byte) &&
164-
DecodeUTF8String(initialValue, size, out string text))
165-
{
166-
replacement = new LdStrUtf8(text);
167-
return true;
168-
}
169-
if (DecodeArrayInitializer(elementType, initialValue, new[] { size }, valuesList))
170-
{
171-
var tempStore = context.Function.RegisterVariable(VariableKind.InitializerTarget, new ArrayType(context.TypeSystem, elementType));
172-
replacement = BlockFromInitializer(tempStore, elementType, new[] { size }, valuesList.ToArray());
173-
return true;
174-
}
175-
}
149+
private static ILInstruction DecodeArrayInitializerOrUTF8StringLiteral(StatementTransformContext context, IType elementType, BlobReader initialValue, int size)
150+
{
151+
if (context.Settings.Utf8StringLiterals && elementType.IsKnownType(KnownTypeCode.Byte)
152+
&& DecodeUTF8String(initialValue, size, out string text))
153+
{
154+
return new LdStrUtf8(text);
176155
}
177-
return false;
156+
var valuesList = new List<ILInstruction>();
157+
if (DecodeArrayInitializer(elementType, initialValue, new[] { size }, valuesList))
158+
{
159+
var tempStore = context.Function.RegisterVariable(VariableKind.InitializerTarget, new ArrayType(context.TypeSystem, elementType));
160+
return BlockFromInitializer(tempStore, elementType, new[] { size }, valuesList.ToArray());
161+
}
162+
163+
return null;
178164
}
179165

180166
private static unsafe bool DecodeUTF8String(BlobReader blob, int size, out string text)
@@ -225,15 +211,13 @@ static bool MatchRuntimeHelpersCreateSpan(Call inst, StatementTransformContext c
225211
{
226212
field = default;
227213
elementType = null;
228-
IType type = inst.Method.DeclaringType;
229-
if (type.Namespace != "System.Runtime.CompilerServices" || type.Name != "RuntimeHelpers" || type.TypeParameterCount != 0)
214+
if (!IsRuntimeHelpers(inst.Method.DeclaringType))
230215
return false;
231216
if (inst.Arguments.Count != 1)
232217
return false;
233-
IMethod method = inst.Method;
234-
if (method.Name != "CreateSpan" || method.TypeArguments.Count != 1)
218+
if (inst.Method is not { Name: "CreateSpan", TypeArguments: [var type] })
235219
return false;
236-
elementType = method.TypeArguments[0];
220+
elementType = type;
237221
if (!inst.Arguments[0].UnwrapConv(ConversionKind.StopGCTracking).MatchLdMemberToken(out var member))
238222
return false;
239223
if (member.MetadataToken.IsNil)
@@ -412,7 +396,7 @@ bool MatchGetStaticFieldAddress(ILInstruction input, out IField field)
412396
return field != null;
413397
}
414398

415-
static bool IsRuntimeHelpers(IType type) => type is { Name: "RuntimeHelpers", Namespace: "System.Runtime.CompilerServices" };
399+
static bool IsRuntimeHelpers(IType type) => type is { Name: "RuntimeHelpers", Namespace: "System.Runtime.CompilerServices", TypeParameterCount: 0 };
416400

417401
unsafe bool HandleSequentialLocAllocInitializer(Block block, int pos, ILVariable store, ILInstruction locAllocInstruction, out IType elementType, out StObj[] values, out int instructionsToRemove)
418402
{

0 commit comments

Comments
 (0)