@@ -115,129 +115,5 @@ public static void EmitLdarg(this ILGenerator ilBuilder, ParameterInfo argument)
115115 break ;
116116 }
117117 }
118-
119- public static void EmitLdindStind ( this ILGenerator ilBuilder , Type resultType )
120- {
121- if ( ! resultType . IsByRef )
122- throw new NotSupportedException ( $ "Cannot emit indirect op for non-reference { resultType } .") ;
123-
124- // The primitive types are Boolean, Byte, SByte, Int16, UInt16, Int32, UInt32, Int64, UInt64, IntPtr, UIntPtr, Char, Double, and Single
125- var valueType = resultType . GetElementType ( ) ;
126- if ( valueType ? . IsEnum ?? false )
127- valueType = valueType . GetEnumUnderlyingType ( ) ;
128-
129- switch ( valueType )
130- {
131- case Type t when t == typeof ( bool ) :
132- /*
133- IL_0018: ldind.u1
134- IL_0019: stind.i1
135- */
136- ilBuilder . Emit ( OpCodes . Ldind_U1 ) ;
137- ilBuilder . Emit ( OpCodes . Stind_I1 ) ;
138- break ;
139- case Type t when t == typeof ( byte ) :
140- /*
141- IL_0018: ldind.u1
142- IL_0019: stind.i1
143- */
144- ilBuilder . Emit ( OpCodes . Ldind_U1 ) ;
145- ilBuilder . Emit ( OpCodes . Stind_I1 ) ;
146- break ;
147- case Type t when t == typeof ( sbyte ) :
148- /*
149- IL_0018: ldind.i1
150- IL_0019: stind.i1
151- */
152- ilBuilder . Emit ( OpCodes . Ldind_I1 ) ;
153- ilBuilder . Emit ( OpCodes . Stind_I1 ) ;
154- break ;
155- case Type t when t == typeof ( short ) :
156- /*
157- IL_0018: ldind.i2
158- IL_0019: stind.i2
159- */
160- ilBuilder . Emit ( OpCodes . Ldind_I2 ) ;
161- ilBuilder . Emit ( OpCodes . Stind_I2 ) ;
162- break ;
163- case Type t1 when t1 == typeof ( ushort ) :
164- case Type t2 when t2 == typeof ( char ) :
165- /*
166- IL_0018: ldind.u2
167- IL_0019: stind.i2
168- */
169- ilBuilder . Emit ( OpCodes . Ldind_U2 ) ;
170- ilBuilder . Emit ( OpCodes . Stind_I2 ) ;
171- break ;
172- case Type t when t == typeof ( int ) :
173- /*
174- IL_0018: ldind.i4
175- IL_0019: stind.i4
176- */
177- ilBuilder . Emit ( OpCodes . Ldind_I4 ) ;
178- ilBuilder . Emit ( OpCodes . Stind_I4 ) ;
179- break ;
180- case Type t when t == typeof ( uint ) :
181- /*
182- IL_0018: ldind.i4
183- IL_0019: stind.i4
184- */
185- ilBuilder . Emit ( OpCodes . Ldind_U4 ) ;
186- ilBuilder . Emit ( OpCodes . Stind_I4 ) ;
187- break ;
188- case Type t1 when t1 == typeof ( ulong ) :
189- case Type t2 when t2 == typeof ( long ) :
190- /*
191- IL_0018: ldind.i8
192- IL_0019: stind.i8
193- */
194- ilBuilder . Emit ( OpCodes . Ldind_I8 ) ;
195- ilBuilder . Emit ( OpCodes . Stind_I8 ) ;
196- break ;
197- case Type t1 when t1 == typeof ( IntPtr ) :
198- case Type t2 when t2 == typeof ( UIntPtr ) :
199- /*
200- IL_0018: ldind.i
201- IL_0019: stind.i
202- */
203- ilBuilder . Emit ( OpCodes . Ldind_I ) ;
204- ilBuilder . Emit ( OpCodes . Stind_I ) ;
205- break ;
206- case Type t when t == typeof ( double ) :
207- /*
208- IL_0018: ldind.r8
209- IL_0019: stind.i8
210- */
211- ilBuilder . Emit ( OpCodes . Ldind_R8 ) ;
212- ilBuilder . Emit ( OpCodes . Stind_R8 ) ;
213- break ;
214- case Type t when t == typeof ( float ) :
215- /*
216- IL_0018: ldind.r4
217- IL_0019: stind.i4
218- */
219- ilBuilder . Emit ( OpCodes . Ldind_R4 ) ;
220- ilBuilder . Emit ( OpCodes . Stind_R4 ) ;
221- break ;
222- case Type t when t . IsClass || t . IsInterface :
223- /*
224- IL_0018: ldind.ref
225- IL_0019: stind.ref
226- */
227- ilBuilder . Emit ( OpCodes . Ldind_Ref ) ;
228- ilBuilder . Emit ( OpCodes . Stind_Ref ) ;
229- break ;
230- case Type t when t . IsEnum || t . IsValueType :
231- /*
232- IL_0018: ldobj valuetype [mscorlib]System.Nullable`1<valuetype [mscorlib]System.TimeSpan>
233- IL_0019: stobj valuetype [mscorlib]System.Nullable`1<valuetype [mscorlib]System.TimeSpan>
234- */
235- ilBuilder . Emit ( OpCodes . Ldobj , valueType ) ;
236- ilBuilder . Emit ( OpCodes . Stobj , valueType ) ;
237- break ;
238- default :
239- throw new NotSupportedException ( $ "Cannot emit indirect store for { resultType } .") ;
240- }
241- }
242118 }
243119}
0 commit comments