@@ -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