0
|
1 using System;
|
|
2 using System.Diagnostics.CodeAnalysis;
|
|
3 using System.Diagnostics.SymbolStore;
|
|
4 using System.Reflection;
|
|
5 using System.Reflection.Emit;
|
|
6 using System.Runtime.InteropServices;
|
|
7
|
|
8 using BLToolkit.Common;
|
|
9 using BLToolkit.Properties;
|
|
10
|
|
11 // ReSharper disable InconsistentNaming
|
|
12
|
|
13 namespace BLToolkit.Reflection.Emit
|
|
14 {
|
|
15 /// <summary>
|
|
16 /// A wrapper around the <see cref="ILGenerator"/> class.
|
|
17 /// </summary>
|
|
18 /// <include file="Examples.CS.xml" path='examples/emit[@name="Emit"]/*' />
|
|
19 /// <include file="Examples.VB.xml" path='examples/emit[@name="Emit"]/*' />
|
|
20 /// <seealso cref="System.Reflection.Emit.ILGenerator">ILGenerator Class</seealso>
|
|
21 public class EmitHelper
|
|
22 {
|
|
23 /// <summary>
|
|
24 /// Initializes a new instance of the <see cref="EmitHelper"/> class
|
|
25 /// with the specified <see cref="System.Reflection.Emit.ILGenerator"/>.
|
|
26 /// </summary>
|
|
27 /// <param name="ilGenerator">The <see cref="System.Reflection.Emit.ILGenerator"/> to use.</param>
|
|
28 public EmitHelper(ILGenerator ilGenerator)
|
|
29 {
|
|
30 if (ilGenerator == null) throw new ArgumentNullException("ilGenerator");
|
|
31
|
|
32 _ilGenerator = ilGenerator;
|
|
33 }
|
|
34
|
|
35 /// <summary>
|
|
36 /// Initializes a new instance of the <see cref="EmitHelper"/> class
|
|
37 /// with the specified <see cref="System.Reflection.Emit.ILGenerator"/>.
|
|
38 /// </summary>
|
|
39 /// <param name="methodBuilder">Associated <see cref="MethodBuilderBase"/>.</param>
|
|
40 /// <param name="ilGenerator">The <see cref="System.Reflection.Emit.ILGenerator"/> to use.</param>
|
|
41 public EmitHelper(MethodBuilderBase methodBuilder, ILGenerator ilGenerator)
|
|
42 {
|
|
43 if (methodBuilder == null) throw new ArgumentNullException("methodBuilder");
|
|
44 if (ilGenerator == null) throw new ArgumentNullException("ilGenerator");
|
|
45
|
|
46 _method = methodBuilder;
|
|
47 _ilGenerator = ilGenerator;
|
|
48 }
|
|
49
|
|
50 private readonly MethodBuilderBase _method;
|
|
51 /// <summary>
|
|
52 /// Gets <see cref="MethodBuilderHelper"/>.
|
|
53 /// </summary>
|
|
54 public MethodBuilderBase Method
|
|
55 {
|
|
56 get { return _method; }
|
|
57 }
|
|
58
|
|
59 private readonly ILGenerator _ilGenerator;
|
|
60 /// <summary>
|
|
61 /// Gets MSIL generator.
|
|
62 /// </summary>
|
|
63 public ILGenerator ILGenerator
|
|
64 {
|
|
65 get { return _ilGenerator; }
|
|
66 }
|
|
67
|
|
68 /// <summary>
|
|
69 /// Converts the supplied <see cref="EmitHelper"/> to a <see cref="ILGenerator"/>.
|
|
70 /// </summary>
|
|
71 /// <param name="emitHelper">The <see cref="EmitHelper"/>.</param>
|
|
72 /// <returns>An ILGenerator.</returns>
|
|
73 public static implicit operator ILGenerator(EmitHelper emitHelper)
|
|
74 {
|
|
75 if (emitHelper == null) throw new ArgumentNullException("emitHelper");
|
|
76
|
|
77 return emitHelper.ILGenerator;
|
|
78 }
|
|
79
|
|
80 #region ILGenerator Methods
|
|
81
|
|
82 /// <summary>
|
|
83 /// Begins a catch block.
|
|
84 /// </summary>
|
|
85 /// <param name="exceptionType">The Type object that represents the exception.</param>
|
|
86 /// <seealso cref="System.Reflection.Emit.ILGenerator.BeginCatchBlock(Type)">ILGenerator.BeginCatchBlock Method</seealso>
|
|
87 public EmitHelper BeginCatchBlock(Type exceptionType)
|
|
88 {
|
|
89 _ilGenerator.BeginCatchBlock(exceptionType); return this;
|
|
90 }
|
|
91
|
|
92 /// <summary>
|
|
93 /// Begins an exception block for a filtered exception.
|
|
94 /// </summary>
|
|
95 /// <seealso cref="System.Reflection.Emit.ILGenerator.BeginExceptFilterBlock">ILGenerator.BeginCatchBlock Method</seealso>
|
|
96 public EmitHelper BeginExceptFilterBlock()
|
|
97 {
|
|
98 _ilGenerator.BeginExceptFilterBlock(); return this;
|
|
99 }
|
|
100
|
|
101 /// <summary>
|
|
102 /// Begins an exception block for a non-filtered exception.
|
|
103 /// </summary>
|
|
104 /// <returns>The label for the end of the block.</returns>
|
|
105 public Label BeginExceptionBlock()
|
|
106 {
|
|
107 return _ilGenerator.BeginExceptionBlock();
|
|
108 }
|
|
109
|
|
110 /// <summary>
|
|
111 /// Begins an exception fault block in the Microsoft intermediate language (MSIL) stream.
|
|
112 /// </summary>
|
|
113 /// <returns>Current instance of the <see cref="EmitHelper"/>.</returns>
|
|
114 public EmitHelper BeginFaultBlock()
|
|
115 {
|
|
116 _ilGenerator.BeginFaultBlock(); return this;
|
|
117 }
|
|
118
|
|
119 /// <summary>
|
|
120 /// Begins a finally block in the Microsoft intermediate language (MSIL) instruction stream.
|
|
121 /// </summary>
|
|
122 /// <returns>Current instance of the <see cref="EmitHelper"/>.</returns>
|
|
123 public EmitHelper BeginFinallyBlock()
|
|
124 {
|
|
125 _ilGenerator.BeginFinallyBlock(); return this;
|
|
126 }
|
|
127
|
|
128 /// <summary>
|
|
129 /// Begins a lexical scope.
|
|
130 /// </summary>
|
|
131 /// <returns>Current instance of the <see cref="EmitHelper"/>.</returns>
|
|
132 public EmitHelper BeginScope()
|
|
133 {
|
|
134 _ilGenerator.BeginScope(); return this;
|
|
135 }
|
|
136
|
|
137 /// <summary>
|
|
138 /// Declares a local variable.
|
|
139 /// </summary>
|
|
140 /// <param name="localType">The Type of the local variable.</param>
|
|
141 /// <returns>The declared local variable.</returns>
|
|
142 public LocalBuilder DeclareLocal(Type localType)
|
|
143 {
|
|
144 return _ilGenerator.DeclareLocal(localType);
|
|
145 }
|
|
146
|
|
147 /// <summary>
|
|
148 /// Declares a local variable, optionally pinning the object referred to by the variable.
|
|
149 /// </summary>
|
|
150 /// <param name="localType">The Type of the local variable.</param>
|
|
151 /// <param name="pinned"><b>true</b> to pin the object in memory; otherwise, <b>false</b>.</param>
|
|
152 /// <returns>The declared local variable.</returns>
|
|
153 public LocalBuilder DeclareLocal(Type localType, bool pinned)
|
|
154 {
|
|
155 return _ilGenerator.DeclareLocal(localType, pinned);
|
|
156 }
|
|
157
|
|
158 /// <summary>
|
|
159 /// Declares a new label.
|
|
160 /// </summary>
|
|
161 /// <returns>Returns a new label that can be used as a token for branching.</returns>
|
|
162 public Label DefineLabel()
|
|
163 {
|
|
164 return _ilGenerator.DefineLabel();
|
|
165 }
|
|
166
|
|
167 /// <summary>
|
|
168 /// Ends an exception block.
|
|
169 /// </summary>
|
|
170 /// <returns>Current instance of the <see cref="EmitHelper"/>.</returns>
|
|
171 public EmitHelper EndExceptionBlock()
|
|
172 {
|
|
173 _ilGenerator.EndExceptionBlock(); return this;
|
|
174 }
|
|
175
|
|
176 /// <summary>
|
|
177 /// Ends a lexical scope.
|
|
178 /// </summary>
|
|
179 /// <returns>Current instance of the <see cref="EmitHelper"/>.</returns>
|
|
180 public EmitHelper EndScope()
|
|
181 {
|
|
182 _ilGenerator.EndScope(); return this;
|
|
183 }
|
|
184
|
|
185 /// <summary>
|
|
186 /// Marks the Microsoft intermediate language (MSIL) stream's current position
|
|
187 /// with the given label.
|
|
188 /// </summary>
|
|
189 /// <param name="loc">The label for which to set an index.</param>
|
|
190 /// <returns>Current instance of the <see cref="EmitHelper"/>.</returns>
|
|
191 public EmitHelper MarkLabel(Label loc)
|
|
192 {
|
|
193 _ilGenerator.MarkLabel(loc); return this;
|
|
194 }
|
|
195
|
|
196 /// <summary>
|
|
197 /// Marks a sequence point in the Microsoft intermediate language (MSIL) stream.
|
|
198 /// </summary>
|
|
199 /// <param name="document">The document for which the sequence point is being defined.</param>
|
|
200 /// <param name="startLine">The line where the sequence point begins.</param>
|
|
201 /// <param name="startColumn">The column in the line where the sequence point begins.</param>
|
|
202 /// <param name="endLine">The line where the sequence point ends.</param>
|
|
203 /// <param name="endColumn">The column in the line where the sequence point ends.</param>
|
|
204 /// <returns>Current instance of the <see cref="EmitHelper"/>.</returns>
|
|
205 public EmitHelper MarkSequencePoint(
|
|
206 ISymbolDocumentWriter document,
|
|
207 int startLine,
|
|
208 int startColumn,
|
|
209 int endLine,
|
|
210 int endColumn)
|
|
211 {
|
|
212 _ilGenerator.MarkSequencePoint(document, startLine, startColumn, endLine, endColumn);
|
|
213 return this;
|
|
214 }
|
|
215
|
|
216 /// <summary>
|
|
217 /// Emits an instruction to throw an exception.
|
|
218 /// </summary>
|
|
219 /// <param name="exceptionType">The class of the type of exception to throw.</param>
|
|
220 /// <returns>Current instance of the <see cref="EmitHelper"/>.</returns>
|
|
221 public EmitHelper ThrowException(Type exceptionType)
|
|
222 {
|
|
223 _ilGenerator.ThrowException(exceptionType); return this;
|
|
224 }
|
|
225
|
|
226 /// <summary>
|
|
227 /// Specifies the namespace to be used in evaluating locals and watches for
|
|
228 /// the current active lexical scope.
|
|
229 /// </summary>
|
|
230 /// <param name="namespaceName">The namespace to be used in evaluating locals and watches for the current active lexical scope.</param>
|
|
231 /// <returns>Current instance of the <see cref="EmitHelper"/>.</returns>
|
|
232 public EmitHelper UsingNamespace(string namespaceName)
|
|
233 {
|
|
234 _ilGenerator.UsingNamespace(namespaceName); return this;
|
|
235 }
|
|
236
|
|
237 #endregion
|
|
238
|
|
239 #region Emit Wrappers
|
|
240
|
|
241 /// <summary>
|
|
242 /// Calls ILGenerator.Emit(<see cref="OpCodes.Add"/>) that
|
|
243 /// adds two values and pushes the result onto the evaluation stack.
|
|
244 /// </summary>
|
|
245 /// <seealso cref="OpCodes.Add">OpCodes.Add</seealso>
|
|
246 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
247 public EmitHelper add
|
|
248 {
|
|
249 get { _ilGenerator.Emit(OpCodes.Add); return this; }
|
|
250 }
|
|
251
|
|
252 /// <summary>
|
|
253 /// Calls ILGenerator.Emit(<see cref="OpCodes.Add_Ovf"/>) that
|
|
254 /// adds two integers, performs an overflow check, and pushes the result onto the evaluation stack.
|
|
255 /// </summary>
|
|
256 /// <seealso cref="OpCodes.Add_Ovf">OpCodes.Add_Ovf</seealso>
|
|
257 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
258 public EmitHelper add_ovf
|
|
259 {
|
|
260 get { _ilGenerator.Emit(OpCodes.Add_Ovf); return this; }
|
|
261 }
|
|
262
|
|
263 /// <summary>
|
|
264 /// Calls ILGenerator.Emit(<see cref="OpCodes.Add_Ovf_Un"/>) that
|
|
265 /// adds two unsigned integer values, performs an overflow check, and pushes the result onto the evaluation stack.
|
|
266 /// </summary>
|
|
267 /// <seealso cref="OpCodes.Add_Ovf_Un">OpCodes.Add_Ovf_Un</seealso>
|
|
268 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
269 public EmitHelper add_ovf_un
|
|
270 {
|
|
271 get { _ilGenerator.Emit(OpCodes.Add_Ovf_Un); return this; }
|
|
272 }
|
|
273
|
|
274 /// <summary>
|
|
275 /// Calls ILGenerator.Emit(<see cref="OpCodes.And"/>) that
|
|
276 /// computes the bitwise AND of two values and pushes the result onto the evalution stack.
|
|
277 /// </summary>
|
|
278 /// <seealso cref="OpCodes.And">OpCodes.And</seealso>
|
|
279 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
280 public EmitHelper and
|
|
281 {
|
|
282 get { _ilGenerator.Emit(OpCodes.And); return this; }
|
|
283 }
|
|
284
|
|
285 /// <summary>
|
|
286 /// Calls ILGenerator.Emit(<see cref="OpCodes.Arglist"/>) that
|
|
287 /// returns an unmanaged pointer to the argument list of the current method.
|
|
288 /// </summary>
|
|
289 /// <seealso cref="OpCodes.Arglist">OpCodes.Arglist</seealso>
|
|
290 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
291 public EmitHelper arglist
|
|
292 {
|
|
293 get { _ilGenerator.Emit(OpCodes.Arglist); return this; }
|
|
294 }
|
|
295
|
|
296 /// <summary>
|
|
297 /// Calls ILGenerator.Emit(<see cref="OpCodes.Beq"/>, label) that
|
|
298 /// transfers control to a target instruction if two values are equal.
|
|
299 /// </summary>
|
|
300 /// <param name="label">The label to branch from this location.</param>
|
|
301 /// <seealso cref="OpCodes.Beq">OpCodes.Beq</seealso>
|
|
302 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,Label)">ILGenerator.Emit</seealso>
|
|
303 public EmitHelper beq(Label label)
|
|
304 {
|
|
305 _ilGenerator.Emit(OpCodes.Beq, label); return this;
|
|
306 }
|
|
307
|
|
308 /// <summary>
|
|
309 /// Calls ILGenerator.Emit(<see cref="OpCodes.Beq_S"/>, label) that
|
|
310 /// transfers control to a target instruction (short form) if two values are equal.
|
|
311 /// </summary>
|
|
312 /// <param name="label">The label to branch from this location.</param>
|
|
313 /// <seealso cref="OpCodes.Beq_S">OpCodes.Beq_S</seealso>
|
|
314 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,Label)">ILGenerator.Emit</seealso>
|
|
315 public EmitHelper beq_s(Label label)
|
|
316 {
|
|
317 _ilGenerator.Emit(OpCodes.Beq_S, label); return this;
|
|
318 }
|
|
319
|
|
320 /// <summary>
|
|
321 /// Calls ILGenerator.Emit(<see cref="OpCodes.Bge"/>, label) that
|
|
322 /// transfers control to a target instruction if the first value is greater than or equal to the second value.
|
|
323 /// </summary>
|
|
324 /// <param name="label">The label to branch from this location.</param>
|
|
325 /// <seealso cref="OpCodes.Bge">OpCodes.Bge</seealso>
|
|
326 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,Label)">ILGenerator.Emit</seealso>
|
|
327 public EmitHelper bge(Label label)
|
|
328 {
|
|
329 _ilGenerator.Emit(OpCodes.Bge, label); return this;
|
|
330 }
|
|
331
|
|
332 /// <summary>
|
|
333 /// Calls ILGenerator.Emit(<see cref="OpCodes.Bge_S"/>, label) that
|
|
334 /// transfers control to a target instruction (short form)
|
|
335 /// if the first value is greater than or equal to the second value.
|
|
336 /// </summary>
|
|
337 /// <param name="label">The label to branch from this location.</param>
|
|
338 /// <seealso cref="OpCodes.Bge_S">OpCodes.Bge_S</seealso>
|
|
339 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,Label)">ILGenerator.Emit</seealso>
|
|
340 public EmitHelper bge_s(Label label)
|
|
341 {
|
|
342 _ilGenerator.Emit(OpCodes.Bge_S, label); return this;
|
|
343 }
|
|
344
|
|
345 /// <summary>
|
|
346 /// Calls ILGenerator.Emit(<see cref="OpCodes.Bge_Un"/>, label) that
|
|
347 /// transfers control to a target instruction if the the first value is greather than the second value,
|
|
348 /// when comparing unsigned integer values or unordered float values.
|
|
349 /// </summary>
|
|
350 /// <param name="label">The label to branch from this location.</param>
|
|
351 /// <seealso cref="OpCodes.Bge_Un">OpCodes.Bge_Un</seealso>
|
|
352 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,Label)">ILGenerator.Emit</seealso>
|
|
353 public EmitHelper bge_un(Label label)
|
|
354 {
|
|
355 _ilGenerator.Emit(OpCodes.Bge_Un, label); return this;
|
|
356 }
|
|
357
|
|
358 /// <summary>
|
|
359 /// Calls ILGenerator.Emit(<see cref="OpCodes.Bge_Un_S"/>, label) that
|
|
360 /// transfers control to a target instruction (short form) if if the the first value is greather than the second value,
|
|
361 /// when comparing unsigned integer values or unordered float values.
|
|
362 /// </summary>
|
|
363 /// <param name="label">The label to branch from this location.</param>
|
|
364 /// <seealso cref="OpCodes.Bge_Un_S">OpCodes.Bge_Un_S</seealso>
|
|
365 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,Label)">ILGenerator.Emit</seealso>
|
|
366 public EmitHelper bge_un_s(Label label)
|
|
367 {
|
|
368 _ilGenerator.Emit(OpCodes.Bge_Un_S, label); return this;
|
|
369 }
|
|
370
|
|
371 /// <summary>
|
|
372 /// Calls ILGenerator.Emit(<see cref="OpCodes.Bgt"/>, label) that
|
|
373 /// transfers control to a target instruction if the first value is greater than the second value.
|
|
374 /// </summary>
|
|
375 /// <param name="label">The label to branch from this location.</param>
|
|
376 /// <seealso cref="OpCodes.Bgt">OpCodes.Bgt</seealso>
|
|
377 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,Label)">ILGenerator.Emit</seealso>
|
|
378 public EmitHelper bgt(Label label)
|
|
379 {
|
|
380 _ilGenerator.Emit(OpCodes.Bgt, label); return this;
|
|
381 }
|
|
382
|
|
383 /// <summary>
|
|
384 /// Calls ILGenerator.Emit(<see cref="OpCodes.Bgt_S"/>, label) that
|
|
385 /// transfers control to a target instruction (short form) if the first value is greater than the second value.
|
|
386 /// </summary>
|
|
387 /// <param name="label">The label to branch from this location.</param>
|
|
388 /// <seealso cref="OpCodes.Bgt_S">OpCodes.Bgt_S</seealso>
|
|
389 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,Label)">ILGenerator.Emit</seealso>
|
|
390 public EmitHelper bgt_s(Label label)
|
|
391 {
|
|
392 _ilGenerator.Emit(OpCodes.Bgt_S, label); return this;
|
|
393 }
|
|
394
|
|
395 /// <summary>
|
|
396 /// Calls ILGenerator.Emit(<see cref="OpCodes.Bgt_Un"/>, label) that
|
|
397 /// transfers control to a target instruction if the first value is greater than the second value,
|
|
398 /// when comparing unsigned integer values or unordered float values.
|
|
399 /// </summary>
|
|
400 /// <param name="label">The label to branch from this location.</param>
|
|
401 /// <seealso cref="OpCodes.Bgt_Un">OpCodes.Bgt_Un</seealso>
|
|
402 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,Label)">ILGenerator.Emit</seealso>
|
|
403 public EmitHelper bgt_un(Label label)
|
|
404 {
|
|
405 _ilGenerator.Emit(OpCodes.Bgt_Un, label); return this;
|
|
406 }
|
|
407
|
|
408 /// <summary>
|
|
409 /// Calls ILGenerator.Emit(<see cref="OpCodes.Bgt_Un_S"/>, label) that
|
|
410 /// transfers control to a target instruction (short form) if the first value is greater than the second value,
|
|
411 /// when comparing unsigned integer values or unordered float values.
|
|
412 /// </summary>
|
|
413 /// <param name="label">The label to branch from this location.</param>
|
|
414 /// <seealso cref="OpCodes.Bgt_Un_S">OpCodes.Bgt_Un_S</seealso>
|
|
415 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,Label)">ILGenerator.Emit</seealso>
|
|
416 public EmitHelper bgt_un_s(Label label)
|
|
417 {
|
|
418 _ilGenerator.Emit(OpCodes.Bgt_Un_S, label); return this;
|
|
419 }
|
|
420
|
|
421 /// <summary>
|
|
422 /// Calls ILGenerator.Emit(<see cref="OpCodes.Ble"/>, label) that
|
|
423 /// transfers control to a target instruction if the first value is less than or equal to the second value.
|
|
424 /// </summary>
|
|
425 /// <param name="label">The label to branch from this location.</param>
|
|
426 /// <seealso cref="OpCodes.Ble">OpCodes.Ble</seealso>
|
|
427 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,Label)">ILGenerator.Emit</seealso>
|
|
428 public EmitHelper ble(Label label)
|
|
429 {
|
|
430 _ilGenerator.Emit(OpCodes.Ble, label); return this;
|
|
431 }
|
|
432
|
|
433 /// <summary>
|
|
434 /// Calls ILGenerator.Emit(<see cref="OpCodes.Ble_S"/>, label) that
|
|
435 /// transfers control to a target instruction (short form) if the first value is less than or equal to the second value.
|
|
436 /// </summary>
|
|
437 /// <param name="label">The label to branch from this location.</param>
|
|
438 /// <seealso cref="OpCodes.Ble_S">OpCodes.Ble_S</seealso>
|
|
439 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,Label)">ILGenerator.Emit</seealso>
|
|
440 public EmitHelper ble_s(Label label)
|
|
441 {
|
|
442 _ilGenerator.Emit(OpCodes.Ble_S, label); return this;
|
|
443 }
|
|
444
|
|
445 /// <summary>
|
|
446 /// Calls ILGenerator.Emit(<see cref="OpCodes.Ble_Un"/>, label) that
|
|
447 /// transfers control to a target instruction if the first value is less than or equal to the second value,
|
|
448 /// when comparing unsigned integer values or unordered float values.
|
|
449 /// </summary>
|
|
450 /// <param name="label">The label to branch from this location.</param>
|
|
451 /// <seealso cref="OpCodes.Ble_Un">OpCodes.Ble_Un</seealso>
|
|
452 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,Label)">ILGenerator.Emit</seealso>
|
|
453 public EmitHelper ble_un(Label label)
|
|
454 {
|
|
455 _ilGenerator.Emit(OpCodes.Ble_Un, label); return this;
|
|
456 }
|
|
457
|
|
458 /// <summary>
|
|
459 /// Calls ILGenerator.Emit(<see cref="OpCodes.Ble_Un_S"/>, label) that
|
|
460 /// transfers control to a target instruction (short form) if the first value is less than or equal to the second value,
|
|
461 /// when comparing unsigned integer values or unordered float values.
|
|
462 /// </summary>
|
|
463 /// <param name="label">The label to branch from this location.</param>
|
|
464 /// <seealso cref="OpCodes.Ble_Un_S">OpCodes.Ble_Un_S</seealso>
|
|
465 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,Label)">ILGenerator.Emit</seealso>
|
|
466 public EmitHelper ble_un_s(Label label)
|
|
467 {
|
|
468 _ilGenerator.Emit(OpCodes.Ble_Un_S, label); return this;
|
|
469 }
|
|
470
|
|
471 /// <summary>
|
|
472 /// Calls ILGenerator.Emit(<see cref="OpCodes.Blt"/>, label) that
|
|
473 /// transfers control to a target instruction if the first value is less than the second value.
|
|
474 /// </summary>
|
|
475 /// <param name="label">The label to branch from this location.</param>
|
|
476 /// <seealso cref="OpCodes.Blt">OpCodes.Blt</seealso>
|
|
477 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,Label)">ILGenerator.Emit</seealso>
|
|
478 public EmitHelper blt(Label label)
|
|
479 {
|
|
480 _ilGenerator.Emit(OpCodes.Blt, label); return this;
|
|
481 }
|
|
482
|
|
483 /// <summary>
|
|
484 /// Calls ILGenerator.Emit(<see cref="OpCodes.Blt_S"/>, label) that
|
|
485 /// transfers control to a target instruction (short form) if the first value is less than the second value.
|
|
486 /// </summary>
|
|
487 /// <param name="label">The label to branch from this location.</param>
|
|
488 /// <seealso cref="OpCodes.Blt_S">OpCodes.Blt_S</seealso>
|
|
489 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,Label)">ILGenerator.Emit</seealso>
|
|
490 public EmitHelper blt_s(Label label)
|
|
491 {
|
|
492 _ilGenerator.Emit(OpCodes.Blt_S, label); return this;
|
|
493 }
|
|
494
|
|
495 /// <summary>
|
|
496 /// Calls ILGenerator.Emit(<see cref="OpCodes.Blt_Un"/>, label) that
|
|
497 /// transfers control to a target instruction if the first value is less than the second value,
|
|
498 /// when comparing unsigned integer values or unordered float values.
|
|
499 /// </summary>
|
|
500 /// <param name="label">The label to branch from this location.</param>
|
|
501 /// <seealso cref="OpCodes.Blt_Un">OpCodes.Blt_Un</seealso>
|
|
502 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,Label)">ILGenerator.Emit</seealso>
|
|
503 public EmitHelper blt_un(Label label)
|
|
504 {
|
|
505 _ilGenerator.Emit(OpCodes.Blt_Un, label); return this;
|
|
506 }
|
|
507
|
|
508 /// <summary>
|
|
509 /// Calls ILGenerator.Emit(<see cref="OpCodes.Blt_Un_S"/>, label) that
|
|
510 /// transfers control to a target instruction (short form) if the first value is less than the second value,
|
|
511 /// when comparing unsigned integer values or unordered float values.
|
|
512 /// </summary>
|
|
513 /// <param name="label">The label to branch from this location.</param>
|
|
514 /// <seealso cref="OpCodes.Blt_Un_S">OpCodes.Blt_Un_S</seealso>
|
|
515 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,Label)">ILGenerator.Emit</seealso>
|
|
516 public EmitHelper blt_un_s(Label label)
|
|
517 {
|
|
518 _ilGenerator.Emit(OpCodes.Blt_Un_S, label); return this;
|
|
519 }
|
|
520
|
|
521 /// <summary>
|
|
522 /// Calls ILGenerator.Emit(<see cref="OpCodes.Bne_Un"/>, label) that
|
|
523 /// transfers control to a target instruction when two unsigned integer values or unordered float values are not equal.
|
|
524 /// </summary>
|
|
525 /// <param name="label">The label to branch from this location.</param>
|
|
526 /// <seealso cref="OpCodes.Bne_Un">OpCodes.Bne_Un</seealso>
|
|
527 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,Label)">ILGenerator.Emit</seealso>
|
|
528 public EmitHelper bne_un(Label label)
|
|
529 {
|
|
530 _ilGenerator.Emit(OpCodes.Bne_Un, label); return this;
|
|
531 }
|
|
532
|
|
533 /// <summary>
|
|
534 /// Calls ILGenerator.Emit(<see cref="OpCodes.Bne_Un_S"/>, label) that
|
|
535 /// transfers control to a target instruction (short form)
|
|
536 /// when two unsigned integer values or unordered float values are not equal.
|
|
537 /// </summary>
|
|
538 /// <param name="label">The label to branch from this location.</param>
|
|
539 /// <seealso cref="OpCodes.Bne_Un_S">OpCodes.Bne_Un_S</seealso>
|
|
540 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,Label)">ILGenerator.Emit</seealso>
|
|
541 public EmitHelper bne_un_s(Label label)
|
|
542 {
|
|
543 _ilGenerator.Emit(OpCodes.Bne_Un_S, label); return this;
|
|
544 }
|
|
545
|
|
546 /// <summary>
|
|
547 /// Calls ILGenerator.Emit(<see cref="OpCodes.Box"/>, type) that
|
|
548 /// converts a value type to an object reference.
|
|
549 /// </summary>
|
|
550 /// <param name="type">A Type</param>
|
|
551 /// <seealso cref="OpCodes.Box">OpCodes.Box</seealso>
|
|
552 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,Type)">ILGenerator.Emit</seealso>
|
|
553 public EmitHelper box(Type type)
|
|
554 {
|
|
555 _ilGenerator.Emit(OpCodes.Box, type); return this;
|
|
556 }
|
|
557
|
|
558 /// <summary>
|
|
559 /// Converts a value type to an object reference if the value is a value type.
|
|
560 /// </summary>
|
|
561 /// <param name="type">A Type</param>
|
|
562 /// <seealso cref="OpCodes.Box">OpCodes.Box</seealso>
|
|
563 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,Type)">ILGenerator.Emit</seealso>
|
|
564 public EmitHelper boxIfValueType(Type type)
|
|
565 {
|
|
566 if (type == null) throw new ArgumentNullException("type");
|
|
567
|
|
568 return type.IsValueType? box(type): this;
|
|
569 }
|
|
570
|
|
571 /// <summary>
|
|
572 /// Calls ILGenerator.Emit(<see cref="OpCodes.Br"/>, label) that
|
|
573 /// unconditionally transfers control to a target instruction.
|
|
574 /// </summary>
|
|
575 /// <param name="label">The label to branch from this location.</param>
|
|
576 /// <seealso cref="OpCodes.Br">OpCodes.Br</seealso>
|
|
577 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,Label)">ILGenerator.Emit</seealso>
|
|
578 public EmitHelper br(Label label)
|
|
579 {
|
|
580 _ilGenerator.Emit(OpCodes.Br, label); return this;
|
|
581 }
|
|
582
|
|
583 /// <summary>
|
|
584 /// Calls ILGenerator.Emit(<see cref="OpCodes.Break"/>) that
|
|
585 /// signals the Common Language Infrastructure (CLI) to inform the debugger that a break point has been tripped.
|
|
586 /// </summary>
|
|
587 /// <seealso cref="OpCodes.Break">OpCodes.Break</seealso>
|
|
588 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
589 public EmitHelper @break
|
|
590 {
|
|
591 get { _ilGenerator.Emit(OpCodes.Break); return this; }
|
|
592 }
|
|
593
|
|
594 /// <summary>
|
|
595 /// Calls ILGenerator.Emit(<see cref="OpCodes.Brfalse"/>, label) that
|
|
596 /// transfers control to a target instruction if value is false, a null reference (Nothing in Visual Basic), or zero.
|
|
597 /// </summary>
|
|
598 /// <param name="label">The label to branch from this location.</param>
|
|
599 /// <seealso cref="OpCodes.Brfalse">OpCodes.Brfalse</seealso>
|
|
600 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,Label)">ILGenerator.Emit</seealso>
|
|
601 public EmitHelper brfalse(Label label)
|
|
602 {
|
|
603 _ilGenerator.Emit(OpCodes.Brfalse, label); return this;
|
|
604 }
|
|
605
|
|
606 /// <summary>
|
|
607 /// Calls ILGenerator.Emit(<see cref="OpCodes.Brfalse_S"/>, label) that
|
|
608 /// transfers control to a target instruction if value is false, a null reference, or zero.
|
|
609 /// </summary>
|
|
610 /// <param name="label">The label to branch from this location.</param>
|
|
611 /// <seealso cref="OpCodes.Brfalse_S">OpCodes.Brfalse_S</seealso>
|
|
612 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,Label)">ILGenerator.Emit</seealso>
|
|
613 public EmitHelper brfalse_s(Label label)
|
|
614 {
|
|
615 _ilGenerator.Emit(OpCodes.Brfalse_S, label); return this;
|
|
616 }
|
|
617
|
|
618 /// <summary>
|
|
619 /// Calls ILGenerator.Emit(<see cref="OpCodes.Brtrue"/>, label) that
|
|
620 /// transfers control to a target instruction if value is true, not null, or non-zero.
|
|
621 /// </summary>
|
|
622 /// <param name="label">The label to branch from this location.</param>
|
|
623 /// <seealso cref="OpCodes.Brtrue">OpCodes.Brtrue</seealso>
|
|
624 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,Label)">ILGenerator.Emit</seealso>
|
|
625 public EmitHelper brtrue(Label label)
|
|
626 {
|
|
627 _ilGenerator.Emit(OpCodes.Brtrue, label); return this;
|
|
628 }
|
|
629
|
|
630 /// <summary>
|
|
631 /// Calls ILGenerator.Emit(<see cref="OpCodes.Brtrue_S"/>, label) that
|
|
632 /// transfers control to a target instruction (short form) if value is true, not null, or non-zero.
|
|
633 /// </summary>
|
|
634 /// <param name="label">The label to branch from this location.</param>
|
|
635 /// <seealso cref="OpCodes.Brtrue_S">OpCodes.Brtrue_S</seealso>
|
|
636 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,Label)">ILGenerator.Emit</seealso>
|
|
637 public EmitHelper brtrue_s(Label label)
|
|
638 {
|
|
639 _ilGenerator.Emit(OpCodes.Brtrue_S, label); return this;
|
|
640 }
|
|
641
|
|
642 /// <summary>
|
|
643 /// Calls ILGenerator.Emit(<see cref="OpCodes.Br_S"/>, label) that
|
|
644 /// unconditionally transfers control to a target instruction (short form).
|
|
645 /// </summary>
|
|
646 /// <param name="label">The label to branch from this location.</param>
|
|
647 /// <seealso cref="OpCodes.Br_S">OpCodes.Br_S</seealso>
|
|
648 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,Label)">ILGenerator.Emit</seealso>
|
|
649 public EmitHelper br_s(Label label)
|
|
650 {
|
|
651 _ilGenerator.Emit(OpCodes.Br_S, label); return this;
|
|
652 }
|
|
653
|
|
654 /// <summary>
|
|
655 /// Calls ILGenerator.Emit(<see cref="OpCodes.Call"/>, methodInfo) that
|
|
656 /// calls the method indicated by the passed method descriptor.
|
|
657 /// </summary>
|
|
658 /// <param name="methodInfo">The method to be called.</param>
|
|
659 /// <seealso cref="OpCodes.Call">OpCodes.Call</seealso>
|
|
660 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,MethodInfo)">ILGenerator.Emit</seealso>
|
|
661 public EmitHelper call(MethodInfo methodInfo)
|
|
662 {
|
|
663 _ilGenerator.Emit(OpCodes.Call, methodInfo); return this;
|
|
664 }
|
|
665
|
|
666 /// <summary>
|
|
667 /// Calls ILGenerator.Emit(<see cref="OpCodes.Call"/>, constructorInfo) that
|
|
668 /// calls the method indicated by the passed method descriptor.
|
|
669 /// </summary>
|
|
670 /// <param name="constructorInfo">The constructor to be called.</param>
|
|
671 /// <seealso cref="OpCodes.Call">OpCodes.Call</seealso>
|
|
672 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,MethodInfo)">ILGenerator.Emit</seealso>
|
|
673 public EmitHelper call(ConstructorInfo constructorInfo)
|
|
674 {
|
|
675 _ilGenerator.Emit(OpCodes.Call, constructorInfo); return this;
|
|
676 }
|
|
677
|
|
678 /// <summary>
|
|
679 /// Calls ILGenerator.EmitCall(<see cref="OpCodes.Call"/>, methodInfo, optionalParameterTypes) that
|
|
680 /// calls the method indicated by the passed method descriptor.
|
|
681 /// </summary>
|
|
682 /// <param name="methodInfo">The method to be called.</param>
|
|
683 /// <param name="optionalParameterTypes">The types of the optional arguments if the method is a varargs method.</param>
|
|
684 /// <seealso cref="OpCodes.Call">OpCodes.Call</seealso>
|
|
685 /// <seealso cref="System.Reflection.Emit.ILGenerator.EmitCall(OpCode,MethodInfo,Type[])">ILGenerator.EmitCall</seealso>
|
|
686 public EmitHelper call(MethodInfo methodInfo, Type[] optionalParameterTypes)
|
|
687 {
|
|
688 _ilGenerator.EmitCall(OpCodes.Call, methodInfo, optionalParameterTypes); return this;
|
|
689 }
|
|
690
|
|
691 /// <summary>
|
|
692 /// Calls ILGenerator.EmitCall(<see cref="OpCodes.Call"/>, methodInfo, optionalParameterTypes) that
|
|
693 /// calls the method indicated by the passed method descriptor.
|
|
694 /// </summary>
|
|
695 /// <param name="type">A Type</param>
|
|
696 /// <param name="methodName">The name of the method to be called.</param>
|
|
697 /// <param name="optionalParameterTypes">The types of the optional arguments if the method is a varargs method.</param>
|
|
698 /// <seealso cref="OpCodes.Call">OpCodes.Call</seealso>
|
|
699 /// <seealso cref="System.Reflection.Emit.ILGenerator.EmitCall(OpCode,MethodInfo,Type[])">ILGenerator.EmitCall</seealso>
|
|
700 public EmitHelper call(Type type, string methodName, params Type[] optionalParameterTypes)
|
|
701 {
|
|
702 if (type == null) throw new ArgumentNullException("type");
|
|
703
|
|
704 MethodInfo methodInfo = type.GetMethod(methodName, optionalParameterTypes);
|
|
705
|
|
706 if (methodInfo == null)
|
|
707 throw CreateNoSuchMethodException(type, methodName);
|
|
708
|
|
709 return call(methodInfo);
|
|
710 }
|
|
711
|
|
712 /// <summary>
|
|
713 /// Calls ILGenerator.EmitCall(<see cref="OpCodes.Call"/>, methodInfo, optionalParameterTypes) that
|
|
714 /// calls the method indicated by the passed method descriptor.
|
|
715 /// </summary>
|
|
716 /// <param name="type">A Type</param>
|
|
717 /// <param name="methodName">The name of the method to be called.</param>
|
|
718 /// <param name="flags">A bitmask comprised of one or more <see cref="BindingFlags"/>
|
|
719 /// that specify how the search is conducted.</param>
|
|
720 /// <param name="optionalParameterTypes">The types of the optional arguments if the method is a varargs method.</param>
|
|
721 /// <seealso cref="OpCodes.Call">OpCodes.Call</seealso>
|
|
722 /// <seealso cref="System.Reflection.Emit.ILGenerator.EmitCall(OpCode,MethodInfo,Type[])">ILGenerator.EmitCall</seealso>
|
|
723 public EmitHelper call(Type type, string methodName, BindingFlags flags, params Type[] optionalParameterTypes)
|
|
724 {
|
|
725 if (type == null) throw new ArgumentNullException("type");
|
|
726
|
|
727 MethodInfo methodInfo = type.GetMethod(methodName, flags, null, optionalParameterTypes, null);
|
|
728
|
|
729 if (methodInfo == null)
|
|
730 throw CreateNoSuchMethodException(type, methodName);
|
|
731
|
|
732 return call(methodInfo);
|
|
733 }
|
|
734
|
|
735 #if !SILVERLIGHT
|
|
736
|
|
737 /// <summary>
|
|
738 /// Calls ILGenerator.EmitCalli(<see cref="OpCodes.Calli"/>, <see cref="CallingConvention"/>, Type, Type[]) that
|
|
739 /// calls the method indicated on the evaluation stack (as a pointer to an entry point)
|
|
740 /// with arguments described by a calling convention using an unmanaged calling convention.
|
|
741 /// </summary>
|
|
742 /// <param name="unmanagedCallConv">The unmanaged calling convention to be used.</param>
|
|
743 /// <param name="returnType">The Type of the result.</param>
|
|
744 /// <param name="parameterTypes">The types of the required arguments to the instruction.</param>
|
|
745 /// <seealso cref="OpCodes.Calli">OpCodes.Calli</seealso>
|
|
746 /// <seealso cref="System.Reflection.Emit.ILGenerator.EmitCalli(OpCode,CallingConvention,Type,Type[])">ILGenerator.EmitCalli</seealso>
|
|
747 public EmitHelper calli(CallingConvention unmanagedCallConv, Type returnType, Type[] parameterTypes)
|
|
748 {
|
|
749 _ilGenerator.EmitCalli(OpCodes.Calli, unmanagedCallConv, returnType, parameterTypes);
|
|
750 return this;
|
|
751 }
|
|
752
|
|
753 /// <summary>
|
|
754 /// Calls ILGenerator.EmitCalli(<see cref="OpCodes.Calli"/>, <see cref="CallingConvention"/>, Type, Type[], Type[]) that
|
|
755 /// calls the method indicated on the evaluation stack (as a pointer to an entry point)
|
|
756 /// with arguments described by a calling convention using a managed calling convention.
|
|
757 /// </summary>
|
|
758 /// <param name="callingConvention">The managed calling convention to be used.</param>
|
|
759 /// <param name="returnType">The Type of the result.</param>
|
|
760 /// <param name="parameterTypes">The types of the required arguments to the instruction.</param>
|
|
761 /// <param name="optionalParameterTypes">The types of the optional arguments for vararg calls.</param>
|
|
762 /// <seealso cref="OpCodes.Calli">OpCodes.Calli</seealso>
|
|
763 /// <seealso cref="System.Reflection.Emit.ILGenerator.EmitCalli(OpCode,CallingConventions,Type,Type[],Type[])">ILGenerator.EmitCalli</seealso>
|
|
764 public EmitHelper calli(CallingConventions callingConvention, Type returnType, Type[] parameterTypes, Type[] optionalParameterTypes)
|
|
765 {
|
|
766 _ilGenerator.EmitCalli(OpCodes.Calli, callingConvention, returnType, parameterTypes, optionalParameterTypes);
|
|
767 return this;
|
|
768 }
|
|
769
|
|
770 #endif
|
|
771
|
|
772 /// <summary>
|
|
773 /// Calls ILGenerator.Emit(<see cref="OpCodes.Callvirt"/>, methodInfo) that
|
|
774 /// calls a late-bound method on an object, pushing the return value onto the evaluation stack.
|
|
775 /// </summary>
|
|
776 /// <param name="methodInfo">The method to be called.</param>
|
|
777 /// <seealso cref="OpCodes.Callvirt">OpCodes.Callvirt</seealso>
|
|
778 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,MethodInfo)">ILGenerator.Emit</seealso>
|
|
779 public EmitHelper callvirt(MethodInfo methodInfo)
|
|
780 {
|
|
781 _ilGenerator.Emit(OpCodes.Callvirt, methodInfo); return this;
|
|
782 }
|
|
783
|
|
784 /// <summary>
|
|
785 /// Calls ILGenerator.EmitCall(<see cref="OpCodes.Callvirt"/>, methodInfo, optionalParameterTypes) that
|
|
786 /// calls a late-bound method on an object, pushing the return value onto the evaluation stack.
|
|
787 /// </summary>
|
|
788 /// <param name="methodInfo">The method to be called.</param>
|
|
789 /// <param name="optionalParameterTypes">The types of the optional arguments if the method is a varargs method.</param>
|
|
790 /// <seealso cref="OpCodes.Callvirt">OpCodes.Callvirt</seealso>
|
|
791 /// <seealso cref="System.Reflection.Emit.ILGenerator.EmitCall(OpCode,MethodInfo,Type[])">ILGenerator.EmitCall</seealso>
|
|
792 public EmitHelper callvirt(MethodInfo methodInfo, Type[] optionalParameterTypes)
|
|
793 {
|
|
794 _ilGenerator.EmitCall(OpCodes.Callvirt, methodInfo, optionalParameterTypes); return this;
|
|
795 }
|
|
796
|
|
797 /// <summary>
|
|
798 /// Calls ILGenerator.EmitCall(<see cref="OpCodes.Callvirt"/>, methodInfo, optionalParameterTypes) that
|
|
799 /// calls a late-bound method on an object, pushing the return value onto the evaluation stack.
|
|
800 /// </summary>
|
|
801 /// <param name="methodName">The method to be called.</param>
|
|
802 /// <param name="type">The declaring type of the method.</param>
|
|
803 /// <param name="optionalParameterTypes">The types of the optional arguments if the method is a varargs method.</param>
|
|
804 /// <seealso cref="OpCodes.Callvirt">OpCodes.Callvirt</seealso>
|
|
805 /// <seealso cref="System.Reflection.Emit.ILGenerator.EmitCall(OpCode,MethodInfo,Type[])">ILGenerator.EmitCall</seealso>
|
|
806 public EmitHelper callvirt(Type type, string methodName, params Type[] optionalParameterTypes)
|
|
807 {
|
|
808 if (type == null) throw new ArgumentNullException("type");
|
|
809
|
|
810 MethodInfo methodInfo = type.GetMethod(methodName, optionalParameterTypes);
|
|
811
|
|
812 if (methodInfo == null)
|
|
813 throw CreateNoSuchMethodException(type, methodName);
|
|
814
|
|
815 return callvirt(methodInfo);
|
|
816 }
|
|
817
|
|
818 /// <summary>
|
|
819 /// Calls ILGenerator.EmitCall(<see cref="OpCodes.Callvirt"/>, methodInfo, optionalParameterTypes) that
|
|
820 /// calls a late-bound method on an object, pushing the return value onto the evaluation stack.
|
|
821 /// </summary>
|
|
822 /// <param name="methodName">The method to be called.</param>
|
|
823 /// <param name="type">The declaring type of the method.</param>
|
|
824 /// <param name="flags">A bitmask comprised of one or more <see cref="BindingFlags"/>
|
|
825 /// that specify how the search is conducted.</param>
|
|
826 /// <param name="optionalParameterTypes">The types of the optional arguments if the method is a varargs method.</param>
|
|
827 /// <seealso cref="OpCodes.Callvirt">OpCodes.Callvirt</seealso>
|
|
828 /// <seealso cref="System.Reflection.Emit.ILGenerator.EmitCall(OpCode,MethodInfo,Type[])">ILGenerator.EmitCall</seealso>
|
|
829 public EmitHelper callvirt(Type type, string methodName, BindingFlags flags, params Type[] optionalParameterTypes)
|
|
830 {
|
|
831 MethodInfo methodInfo =
|
|
832 optionalParameterTypes == null?
|
|
833 type.GetMethod(methodName, flags):
|
|
834 type.GetMethod(methodName, flags, null, optionalParameterTypes, null);
|
|
835
|
|
836 if (methodInfo == null)
|
|
837 throw CreateNoSuchMethodException(type, methodName);
|
|
838
|
|
839 return callvirt(methodInfo, null);
|
|
840 }
|
|
841
|
|
842 /// <summary>
|
|
843 /// Calls ILGenerator.EmitCall(<see cref="OpCodes.Callvirt"/>, methodInfo, optionalParameterTypes) that
|
|
844 /// calls a late-bound method on an object, pushing the return value onto the evaluation stack.
|
|
845 /// </summary>
|
|
846 /// <param name="methodName">The method to be called.</param>
|
|
847 /// <param name="type">The declaring type of the method.</param>
|
|
848 /// <param name="flags">A bitmask comprised of one or more <see cref="BindingFlags"/>
|
|
849 /// that specify how the search is conducted.</param>
|
|
850 /// <seealso cref="OpCodes.Callvirt">OpCodes.Callvirt</seealso>
|
|
851 /// <seealso cref="System.Reflection.Emit.ILGenerator.EmitCall(OpCode,MethodInfo,Type[])">ILGenerator.EmitCall</seealso>
|
|
852 public EmitHelper callvirt(Type type, string methodName, BindingFlags flags)
|
|
853 {
|
|
854 return callvirt(type, methodName, flags, null);
|
|
855 }
|
|
856
|
|
857 /// <summary>
|
|
858 /// Calls ILGenerator.EmitCall(<see cref="OpCodes.Callvirt"/>, methodInfo, optionalParameterTypes) that
|
|
859 /// calls a late-bound method on an object, pushing the return value onto the evaluation stack.
|
|
860 /// </summary>
|
|
861 /// <param name="methodName">The non-generic method to be called.</param>
|
|
862 /// <param name="type">The declaring type of the method.</param>
|
|
863 /// <param name="optionalParameterTypes">The types of the optional arguments if the method is a varargs method.</param>
|
|
864 /// <seealso cref="OpCodes.Callvirt">OpCodes.Callvirt</seealso>
|
|
865 /// <seealso cref="System.Reflection.Emit.ILGenerator.EmitCall(OpCode,MethodInfo,Type[])">ILGenerator.EmitCall</seealso>
|
|
866 public EmitHelper callvirtNoGenerics(Type type, string methodName, params Type[] optionalParameterTypes)
|
|
867 {
|
|
868 MethodInfo methodInfo = type.GetMethod(
|
|
869 methodName,
|
|
870 BindingFlags.Instance | BindingFlags.Public,
|
|
871 GenericBinder.NonGeneric,
|
|
872 optionalParameterTypes, null);
|
|
873
|
|
874 if (methodInfo == null)
|
|
875 throw CreateNoSuchMethodException(type, methodName);
|
|
876
|
|
877 return callvirt(methodInfo);
|
|
878 }
|
|
879
|
|
880 /// <summary>
|
|
881 /// Calls ILGenerator.Emit(<see cref="OpCodes.Castclass"/>, type) that
|
|
882 /// attempts to cast an object passed by reference to the specified class.
|
|
883 /// </summary>
|
|
884 /// <param name="type">A Type</param>
|
|
885 /// <seealso cref="OpCodes.Castclass">OpCodes.Castclass</seealso>
|
|
886 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,Type)">ILGenerator.Emit</seealso>
|
|
887 public EmitHelper castclass(Type type)
|
|
888 {
|
|
889 _ilGenerator.Emit(OpCodes.Castclass, type); return this;
|
|
890 }
|
|
891
|
|
892 /// <summary>
|
|
893 /// Attempts to cast an object passed by reference to the specified class
|
|
894 /// or to unbox if the type is a value type.
|
|
895 /// </summary>
|
|
896 /// <param name="type">A Type</param>
|
|
897 public EmitHelper castType(Type type)
|
|
898 {
|
|
899 if (type == null) throw new ArgumentNullException("type");
|
|
900
|
|
901 return type.IsValueType? unbox_any(type): castclass(type);
|
|
902 }
|
|
903
|
|
904 /// <summary>
|
|
905 /// Calls ILGenerator.Emit(<see cref="OpCodes.Ceq"/>) that
|
|
906 /// compares two values. If they are equal, the integer value 1 (int32) is pushed onto the evaluation stack;
|
|
907 /// otherwise 0 (int32) is pushed onto the evaluation stack.
|
|
908 /// </summary>
|
|
909 /// <seealso cref="OpCodes.Ceq">OpCodes.Ceq</seealso>
|
|
910 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
911 public EmitHelper ceq
|
|
912 {
|
|
913 get { _ilGenerator.Emit(OpCodes.Ceq); return this; }
|
|
914 }
|
|
915
|
|
916 /// <summary>
|
|
917 /// Calls ILGenerator.Emit(<see cref="OpCodes.Cgt"/>) that
|
|
918 /// compares two values. If the first value is greater than the second,
|
|
919 /// the integer value 1 (int32) is pushed onto the evaluation stack;
|
|
920 /// otherwise 0 (int32) is pushed onto the evaluation stack.
|
|
921 /// </summary>
|
|
922 /// <seealso cref="OpCodes.Cgt">OpCodes.Cgt</seealso>
|
|
923 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
924 public EmitHelper cgt
|
|
925 {
|
|
926 get { _ilGenerator.Emit(OpCodes.Cgt); return this; }
|
|
927 }
|
|
928
|
|
929 /// <summary>
|
|
930 /// Calls ILGenerator.Emit(<see cref="OpCodes.Cgt_Un"/>) that
|
|
931 /// compares two unsigned or unordered values.
|
|
932 /// If the first value is greater than the second, the integer value 1 (int32) is pushed onto the evaluation stack;
|
|
933 /// otherwise 0 (int32) is pushed onto the evaluation stack.
|
|
934 /// </summary>
|
|
935 /// <seealso cref="OpCodes.Cgt_Un">OpCodes.Cgt_Un</seealso>
|
|
936 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
937 public EmitHelper cgt_un
|
|
938 {
|
|
939 get { _ilGenerator.Emit(OpCodes.Cgt_Un); return this; }
|
|
940 }
|
|
941
|
|
942 /// <summary>
|
|
943 /// Calls ILGenerator.Emit(<see cref="OpCodes.Constrained"/>) that
|
|
944 /// constrains the type on which a virtual method call is made.
|
|
945 /// </summary>
|
|
946 /// <param name="type">A Type</param>
|
|
947 /// <seealso cref="OpCodes.Cgt_Un">OpCodes.Constrained</seealso>
|
|
948 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
949 public EmitHelper constrained(Type type)
|
|
950 {
|
|
951 _ilGenerator.Emit(OpCodes.Constrained, type); return this;
|
|
952 }
|
|
953
|
|
954 /// <summary>
|
|
955 /// Calls ILGenerator.Emit(<see cref="OpCodes.Ckfinite"/>) that
|
|
956 /// throws <see cref="ArithmeticException"/> if value is not a finite number.
|
|
957 /// </summary>
|
|
958 /// <seealso cref="OpCodes.Ckfinite">OpCodes.Ckfinite</seealso>
|
|
959 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
960 public EmitHelper ckfinite
|
|
961 {
|
|
962 get { _ilGenerator.Emit(OpCodes.Ckfinite); return this; }
|
|
963 }
|
|
964
|
|
965 /// <summary>
|
|
966 /// Calls ILGenerator.Emit(<see cref="OpCodes.Clt"/>) that
|
|
967 /// compares two values. If the first value is less than the second,
|
|
968 /// the integer value 1 (int32) is pushed onto the evaluation stack;
|
|
969 /// otherwise 0 (int32) is pushed onto the evaluation stack.
|
|
970 /// </summary>
|
|
971 /// <seealso cref="OpCodes.Clt">OpCodes.Clt</seealso>
|
|
972 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
973 public EmitHelper clt
|
|
974 {
|
|
975 get { _ilGenerator.Emit(OpCodes.Clt); return this; }
|
|
976 }
|
|
977
|
|
978 /// <summary>
|
|
979 /// Calls ILGenerator.Emit(<see cref="OpCodes.Clt_Un"/>) that
|
|
980 /// compares the unsigned or unordered values value1 and value2.
|
|
981 /// If value1 is less than value2, then the integer value 1 (int32) is pushed onto the evaluation stack;
|
|
982 /// otherwise 0 (int32) is pushed onto the evaluation stack.
|
|
983 /// </summary>
|
|
984 /// <seealso cref="OpCodes.Clt_Un">OpCodes.Clt_Un</seealso>
|
|
985 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
986 public EmitHelper clt_un
|
|
987 {
|
|
988 get { _ilGenerator.Emit(OpCodes.Clt_Un); return this; }
|
|
989 }
|
|
990
|
|
991 /// <summary>
|
|
992 /// Calls ILGenerator.Emit(<see cref="OpCodes.Conv_I"/>) that
|
|
993 /// converts the value on top of the evaluation stack to natural int.
|
|
994 /// </summary>
|
|
995 /// <seealso cref="OpCodes.Conv_I">OpCodes.Conv_I</seealso>
|
|
996 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
997 public EmitHelper conv_i
|
|
998 {
|
|
999 get { _ilGenerator.Emit(OpCodes.Conv_I); return this; }
|
|
1000 }
|
|
1001
|
|
1002 /// <summary>
|
|
1003 /// Calls ILGenerator.Emit(<see cref="OpCodes.Conv_I1"/>) that
|
|
1004 /// converts the value on top of the evaluation stack to int8, then extends (pads) it to int32.
|
|
1005 /// </summary>
|
|
1006 /// <seealso cref="OpCodes.Conv_I1">OpCodes.Conv_I1</seealso>
|
|
1007 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
1008 public EmitHelper conv_i1
|
|
1009 {
|
|
1010 get { _ilGenerator.Emit(OpCodes.Conv_I1); return this; }
|
|
1011 }
|
|
1012
|
|
1013 /// <summary>
|
|
1014 /// Calls ILGenerator.Emit(<see cref="OpCodes.Conv_I2"/>) that
|
|
1015 /// converts the value on top of the evaluation stack to int16, then extends (pads) it to int32.
|
|
1016 /// </summary>
|
|
1017 /// <seealso cref="OpCodes.Conv_I2">OpCodes.Conv_I2</seealso>
|
|
1018 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
1019 public EmitHelper conv_i2
|
|
1020 {
|
|
1021 get { _ilGenerator.Emit(OpCodes.Conv_I2); return this; }
|
|
1022 }
|
|
1023
|
|
1024 /// <summary>
|
|
1025 /// Calls ILGenerator.Emit(<see cref="OpCodes.Conv_I4"/>) that
|
|
1026 /// converts the value on top of the evaluation stack to int32.
|
|
1027 /// </summary>
|
|
1028 /// <seealso cref="OpCodes.Conv_I4">OpCodes.Conv_I4</seealso>
|
|
1029 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
1030 public EmitHelper conv_i4
|
|
1031 {
|
|
1032 get { _ilGenerator.Emit(OpCodes.Conv_I4); return this; }
|
|
1033 }
|
|
1034
|
|
1035 /// <summary>
|
|
1036 /// Calls ILGenerator.Emit(<see cref="OpCodes.Conv_I8"/>) that
|
|
1037 /// converts the value on top of the evaluation stack to int64.
|
|
1038 /// </summary>
|
|
1039 /// <seealso cref="OpCodes.Conv_I8">OpCodes.Conv_I8</seealso>
|
|
1040 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
1041 public EmitHelper conv_i8
|
|
1042 {
|
|
1043 get { _ilGenerator.Emit(OpCodes.Conv_I8); return this; }
|
|
1044 }
|
|
1045
|
|
1046 /// <summary>
|
|
1047 /// Converts the value on top of the evaluation stack to the specified type.
|
|
1048 /// </summary>
|
|
1049 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
1050 public EmitHelper conv(Type type)
|
|
1051 {
|
|
1052 if (type == null) throw new ArgumentNullException("type");
|
|
1053
|
|
1054 switch (Type.GetTypeCode(type))
|
|
1055 {
|
|
1056 case TypeCode.Boolean:
|
|
1057 case TypeCode.SByte: conv_i1.end(); break;
|
|
1058 case TypeCode.Int16: conv_i2.end(); break;
|
|
1059 case TypeCode.Int32: conv_i4.end(); break;
|
|
1060 case TypeCode.Int64: conv_i8.end(); break;
|
|
1061
|
|
1062 case TypeCode.Byte: conv_u1.end(); break;
|
|
1063 case TypeCode.Char:
|
|
1064 case TypeCode.UInt16: conv_u2.end(); break;
|
|
1065 case TypeCode.UInt32: conv_u4.end(); break;
|
|
1066 case TypeCode.UInt64: conv_u8.end(); break;
|
|
1067
|
|
1068 case TypeCode.Single: conv_r4.end(); break;
|
|
1069 case TypeCode.Double: conv_r8.end(); break;
|
|
1070
|
|
1071 default:
|
|
1072 {
|
|
1073 if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>))
|
|
1074 {
|
|
1075 ConstructorInfo ci = type.GetConstructor(type.GetGenericArguments());
|
|
1076 if (ci != null)
|
|
1077 {
|
|
1078 newobj(ci);
|
|
1079 break;
|
|
1080 }
|
|
1081 }
|
|
1082
|
|
1083 throw CreateNotExpectedTypeException(type);
|
|
1084 }
|
|
1085 }
|
|
1086
|
|
1087 return this;
|
|
1088 }
|
|
1089
|
|
1090
|
|
1091 /// <summary>
|
|
1092 /// Calls ILGenerator.Emit(<see cref="OpCodes.Conv_Ovf_I"/>) that
|
|
1093 /// converts the signed value on top of the evaluation stack to signed natural int,
|
|
1094 /// throwing <see cref="OverflowException"/> on overflow.
|
|
1095 /// </summary>
|
|
1096 /// <seealso cref="OpCodes.Conv_Ovf_I">OpCodes.Conv_Ovf_I</seealso>
|
|
1097 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
1098 public EmitHelper conv_ovf_i
|
|
1099 {
|
|
1100 get { _ilGenerator.Emit(OpCodes.Conv_Ovf_I); return this; }
|
|
1101 }
|
|
1102
|
|
1103 /// <summary>
|
|
1104 /// Calls ILGenerator.Emit(<see cref="OpCodes.Conv_Ovf_I1"/>) that
|
|
1105 /// converts the signed value on top of the evaluation stack to signed int8 and extends it to int32,
|
|
1106 /// throwing <see cref="OverflowException"/> on overflow.
|
|
1107 /// </summary>
|
|
1108 /// <seealso cref="OpCodes.Conv_Ovf_I1">OpCodes.Conv_Ovf_I1</seealso>
|
|
1109 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
1110 public EmitHelper conv_ovf_i1
|
|
1111 {
|
|
1112 get { _ilGenerator.Emit(OpCodes.Conv_Ovf_I1); return this; }
|
|
1113 }
|
|
1114
|
|
1115 /// <summary>
|
|
1116 /// Calls ILGenerator.Emit(<see cref="OpCodes.Conv_Ovf_I1_Un"/>) that
|
|
1117 /// converts the unsigned value on top of the evaluation stack to signed int8 and extends it to int32,
|
|
1118 /// throwing <see cref="OverflowException"/> on overflow.
|
|
1119 /// </summary>
|
|
1120 /// <seealso cref="OpCodes.Conv_Ovf_I1_Un">OpCodes.Conv_Ovf_I1_Un</seealso>
|
|
1121 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
1122 public EmitHelper conv_ovf_i1_un
|
|
1123 {
|
|
1124 get { _ilGenerator.Emit(OpCodes.Conv_Ovf_I1_Un); return this; }
|
|
1125 }
|
|
1126
|
|
1127 /// <summary>
|
|
1128 /// Calls ILGenerator.Emit(<see cref="OpCodes.Conv_Ovf_I2"/>) that
|
|
1129 /// converts the signed value on top of the evaluation stack to signed int16 and extending it to int32,
|
|
1130 /// throwing <see cref="OverflowException"/> on overflow.
|
|
1131 /// </summary>
|
|
1132 /// <seealso cref="OpCodes.Conv_Ovf_I2">OpCodes.Conv_Ovf_I2</seealso>
|
|
1133 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
1134 public EmitHelper conv_ovf_i2
|
|
1135 {
|
|
1136 get { _ilGenerator.Emit(OpCodes.Conv_Ovf_I2); return this; }
|
|
1137 }
|
|
1138
|
|
1139 /// <summary>
|
|
1140 /// Calls ILGenerator.Emit(<see cref="OpCodes.Conv_Ovf_I2_Un"/>) that
|
|
1141 /// converts the unsigned value on top of the evaluation stack to signed int16 and extends it to int32,
|
|
1142 /// throwing <see cref="OverflowException"/> on overflow.
|
|
1143 /// </summary>
|
|
1144 /// <seealso cref="OpCodes.Conv_Ovf_I2_Un">OpCodes.Conv_Ovf_I2_Un</seealso>
|
|
1145 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
1146 public EmitHelper conv_ovf_i2_un
|
|
1147 {
|
|
1148 get { _ilGenerator.Emit(OpCodes.Conv_Ovf_I2_Un); return this; }
|
|
1149 }
|
|
1150
|
|
1151 /// <summary>
|
|
1152 /// Calls ILGenerator.Emit(<see cref="OpCodes.Conv_Ovf_I4"/>) that
|
|
1153 /// converts the signed value on top of the evaluation tack to signed int32, throwing <see cref="OverflowException"/> on overflow.
|
|
1154 /// </summary>
|
|
1155 /// <seealso cref="OpCodes.Conv_Ovf_I4">OpCodes.Conv_Ovf_I4</seealso>
|
|
1156 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
1157 public EmitHelper conv_ovf_i4
|
|
1158 {
|
|
1159 get { _ilGenerator.Emit(OpCodes.Conv_Ovf_I2_Un); return this; }
|
|
1160 }
|
|
1161
|
|
1162 /// <summary>
|
|
1163 /// Calls ILGenerator.Emit(<see cref="OpCodes.Conv_Ovf_I4_Un"/>) that
|
|
1164 /// converts the unsigned value on top of the evaluation stack to signed int32, throwing <see cref="OverflowException"/> on overflow.
|
|
1165 /// </summary>
|
|
1166 /// <seealso cref="OpCodes.Conv_Ovf_I4_Un">OpCodes.Conv_Ovf_I4_Un</seealso>
|
|
1167 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
1168 public EmitHelper conv_ovf_i4_un
|
|
1169 {
|
|
1170 get { _ilGenerator.Emit(OpCodes.Conv_Ovf_I4_Un); return this; }
|
|
1171 }
|
|
1172
|
|
1173 /// <summary>
|
|
1174 /// Calls ILGenerator.Emit(<see cref="OpCodes.Conv_Ovf_I8"/>) that
|
|
1175 /// converts the signed value on top of the evaluation stack to signed int64,
|
|
1176 /// throwing <see cref="OverflowException"/> on overflow.
|
|
1177 /// </summary>
|
|
1178 /// <seealso cref="OpCodes.Conv_Ovf_I8">OpCodes.Conv_Ovf_I8</seealso>
|
|
1179 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
1180 public EmitHelper conv_ovf_i8
|
|
1181 {
|
|
1182 get { _ilGenerator.Emit(OpCodes.Conv_Ovf_I8); return this; }
|
|
1183 }
|
|
1184
|
|
1185 /// <summary>
|
|
1186 /// Calls ILGenerator.Emit(<see cref="OpCodes.Conv_Ovf_I8_Un"/>) that
|
|
1187 /// converts the unsigned value on top of the evaluation stack to signed int64, throwing <see cref="OverflowException"/> on overflow.
|
|
1188 /// </summary>
|
|
1189 /// <seealso cref="OpCodes.Conv_Ovf_I8_Un">OpCodes.Conv_Ovf_I8_Un</seealso>
|
|
1190 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
1191 public EmitHelper conv_ovf_i8_un
|
|
1192 {
|
|
1193 get { _ilGenerator.Emit(OpCodes.Conv_Ovf_I8_Un); return this; }
|
|
1194 }
|
|
1195
|
|
1196 /// <summary>
|
|
1197 /// Calls ILGenerator.Emit(<see cref="OpCodes.Conv_Ovf_I_Un"/>) that
|
|
1198 /// converts the unsigned value on top of the evaluation stack to signed natural int,
|
|
1199 /// throwing <see cref="OverflowException"/> on overflow.
|
|
1200 /// </summary>
|
|
1201 /// <seealso cref="OpCodes.Conv_Ovf_I_Un">OpCodes.Conv_Ovf_I_Un</seealso>
|
|
1202 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
1203 public EmitHelper conv_ovf_i_un
|
|
1204 {
|
|
1205 get { _ilGenerator.Emit(OpCodes.Conv_Ovf_I_Un); return this; }
|
|
1206 }
|
|
1207
|
|
1208 /// <summary>
|
|
1209 /// Calls ILGenerator.Emit(<see cref="OpCodes.Conv_Ovf_U"/>) that
|
|
1210 /// converts the signed value on top of the evaluation stack to unsigned natural int,
|
|
1211 /// throwing <see cref="OverflowException"/> on overflow.
|
|
1212 /// </summary>
|
|
1213 /// <seealso cref="OpCodes.Conv_Ovf_U">OpCodes.Conv_Ovf_U</seealso>
|
|
1214 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
1215 public EmitHelper conv_ovf_u
|
|
1216 {
|
|
1217 get { _ilGenerator.Emit(OpCodes.Conv_Ovf_U); return this; }
|
|
1218 }
|
|
1219
|
|
1220 /// <summary>
|
|
1221 /// Calls ILGenerator.Emit(<see cref="OpCodes.Conv_Ovf_U1"/>) that
|
|
1222 /// converts the signed value on top of the evaluation stack to unsigned int8 and extends it to int32,
|
|
1223 /// throwing <see cref="OverflowException"/> on overflow.
|
|
1224 /// </summary>
|
|
1225 /// <seealso cref="OpCodes.Conv_Ovf_U1">OpCodes.Conv_Ovf_U1</seealso>
|
|
1226 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
1227 public EmitHelper conv_ovf_u1
|
|
1228 {
|
|
1229 get { _ilGenerator.Emit(OpCodes.Conv_Ovf_U1); return this; }
|
|
1230 }
|
|
1231
|
|
1232 /// <summary>
|
|
1233 /// Calls ILGenerator.Emit(<see cref="OpCodes.Conv_Ovf_U1_Un"/>) that
|
|
1234 /// converts the unsigned value on top of the evaluation stack to unsigned int8 and extends it to int32,
|
|
1235 /// throwing <see cref="OverflowException"/> on overflow.
|
|
1236 /// </summary>
|
|
1237 /// <seealso cref="OpCodes.Conv_Ovf_U1_Un">OpCodes.Conv_Ovf_U1_Un</seealso>
|
|
1238 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
1239 public EmitHelper conv_ovf_u1_un
|
|
1240 {
|
|
1241 get { _ilGenerator.Emit(OpCodes.Conv_Ovf_U1_Un); return this; }
|
|
1242 }
|
|
1243
|
|
1244 /// <summary>
|
|
1245 /// Calls ILGenerator.Emit(<see cref="OpCodes.Conv_Ovf_U2"/>) that
|
|
1246 /// converts the signed value on top of the evaluation stack to unsigned int16 and extends it to int32,
|
|
1247 /// throwing <see cref="OverflowException"/> on overflow.
|
|
1248 /// </summary>
|
|
1249 /// <seealso cref="OpCodes.Conv_Ovf_U2">OpCodes.Conv_Ovf_U2</seealso>
|
|
1250 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
1251 public EmitHelper conv_ovf_u2
|
|
1252 {
|
|
1253 get { _ilGenerator.Emit(OpCodes.Conv_Ovf_U2); return this; }
|
|
1254 }
|
|
1255
|
|
1256 /// <summary>
|
|
1257 /// Calls ILGenerator.Emit(<see cref="OpCodes.Conv_Ovf_U2_Un"/>) that
|
|
1258 /// converts the unsigned value on top of the evaluation stack to unsigned int16 and extends it to int32,
|
|
1259 /// throwing <see cref="OverflowException"/> on overflow.
|
|
1260 /// </summary>
|
|
1261 /// <seealso cref="OpCodes.Conv_Ovf_U2_Un">OpCodes.Conv_Ovf_U2_Un</seealso>
|
|
1262 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
1263 public EmitHelper conv_ovf_u2_un
|
|
1264 {
|
|
1265 get { _ilGenerator.Emit(OpCodes.Conv_Ovf_U2_Un); return this; }
|
|
1266 }
|
|
1267
|
|
1268 /// <summary>
|
|
1269 /// Calls ILGenerator.Emit(<see cref="OpCodes.Conv_Ovf_U4"/>) that
|
|
1270 /// Converts the signed value on top of the evaluation stack to unsigned int32, throwing <see cref="OverflowException"/> on overflow.
|
|
1271 /// </summary>
|
|
1272 /// <seealso cref="OpCodes.Conv_Ovf_U4">OpCodes.Conv_Ovf_U4</seealso>
|
|
1273 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
1274 public EmitHelper conv_ovf_u4
|
|
1275 {
|
|
1276 get { _ilGenerator.Emit(OpCodes.Conv_Ovf_U4); return this; }
|
|
1277 }
|
|
1278
|
|
1279 /// <summary>
|
|
1280 /// Calls ILGenerator.Emit(<see cref="OpCodes.Conv_Ovf_U4_Un"/>) that
|
|
1281 /// converts the unsigned value on top of the evaluation stack to unsigned int32, throwing <see cref="OverflowException"/> on overflow.
|
|
1282 /// </summary>
|
|
1283 /// <seealso cref="OpCodes.Conv_Ovf_U4_Un">OpCodes.Conv_Ovf_U4_Un</seealso>
|
|
1284 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
1285 public EmitHelper conv_ovf_u4_un
|
|
1286 {
|
|
1287 get { _ilGenerator.Emit(OpCodes.Conv_Ovf_U4_Un); return this; }
|
|
1288 }
|
|
1289
|
|
1290 /// <summary>
|
|
1291 /// Calls ILGenerator.Emit(<see cref="OpCodes.Conv_Ovf_U8"/>) that
|
|
1292 /// converts the signed value on top of the evaluation stack to unsigned int64, throwing <see cref="OverflowException"/> on overflow.
|
|
1293 /// </summary>
|
|
1294 /// <seealso cref="OpCodes.Conv_Ovf_U8">OpCodes.Conv_Ovf_U8</seealso>
|
|
1295 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
1296 public EmitHelper conv_ovf_u8
|
|
1297 {
|
|
1298 get { _ilGenerator.Emit(OpCodes.Conv_Ovf_U8); return this; }
|
|
1299 }
|
|
1300
|
|
1301 /// <summary>
|
|
1302 /// Calls ILGenerator.Emit(<see cref="OpCodes.Conv_Ovf_U8_Un"/>) that
|
|
1303 /// converts the unsigned value on top of the evaluation stack to unsigned int64, throwing <see cref="OverflowException"/> on overflow.
|
|
1304 /// </summary>
|
|
1305 /// <seealso cref="OpCodes.Conv_Ovf_U8_Un">OpCodes.Conv_Ovf_U8_Un</seealso>
|
|
1306 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
1307 public EmitHelper conv_ovf_u8_un
|
|
1308 {
|
|
1309 get { _ilGenerator.Emit(OpCodes.Conv_Ovf_U8_Un); return this; }
|
|
1310 }
|
|
1311
|
|
1312 /// <summary>
|
|
1313 /// Calls ILGenerator.Emit(<see cref="OpCodes.Conv_Ovf_U_Un"/>) that
|
|
1314 /// converts the unsigned value on top of the evaluation stack to unsigned natural int,
|
|
1315 /// throwing <see cref="OverflowException"/> on overflow.
|
|
1316 /// </summary>
|
|
1317 /// <seealso cref="OpCodes.Conv_Ovf_U_Un">OpCodes.Conv_Ovf_U_Un</seealso>
|
|
1318 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
1319 public EmitHelper conv_ovf_u_un
|
|
1320 {
|
|
1321 get { _ilGenerator.Emit(OpCodes.Conv_Ovf_U_Un); return this; }
|
|
1322 }
|
|
1323
|
|
1324 /// <summary>
|
|
1325 /// Calls ILGenerator.Emit(<see cref="OpCodes.Conv_R4"/>) that
|
|
1326 /// converts the value on top of the evaluation stack to float32.
|
|
1327 /// </summary>
|
|
1328 /// <seealso cref="OpCodes.Conv_R4">OpCodes.Conv_R4</seealso>
|
|
1329 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
1330 public EmitHelper conv_r4
|
|
1331 {
|
|
1332 get { _ilGenerator.Emit(OpCodes.Conv_R4); return this; }
|
|
1333 }
|
|
1334
|
|
1335 /// <summary>
|
|
1336 /// Calls ILGenerator.Emit(<see cref="OpCodes.Conv_R8"/>) that
|
|
1337 /// converts the value on top of the evaluation stack to float64.
|
|
1338 /// </summary>
|
|
1339 /// <seealso cref="OpCodes.Conv_R8">OpCodes.Conv_R8</seealso>
|
|
1340 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
1341 public EmitHelper conv_r8
|
|
1342 {
|
|
1343 get { _ilGenerator.Emit(OpCodes.Conv_R8); return this; }
|
|
1344 }
|
|
1345
|
|
1346 /// <summary>
|
|
1347 /// Calls ILGenerator.Emit(<see cref="OpCodes.Conv_R_Un"/>) that
|
|
1348 /// converts the unsigned integer value on top of the evaluation stack to float32.
|
|
1349 /// </summary>
|
|
1350 /// <seealso cref="OpCodes.Conv_R_Un">OpCodes.Conv_R_Un</seealso>
|
|
1351 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
1352 public EmitHelper conv_r_un
|
|
1353 {
|
|
1354 get { _ilGenerator.Emit(OpCodes.Conv_R_Un); return this; }
|
|
1355 }
|
|
1356
|
|
1357 /// <summary>
|
|
1358 /// Calls ILGenerator.Emit(<see cref="OpCodes.Conv_U"/>) that
|
|
1359 /// converts the value on top of the evaluation stack to unsigned natural int, and extends it to natural int.
|
|
1360 /// </summary>
|
|
1361 /// <seealso cref="OpCodes.Conv_U">OpCodes.Conv_U</seealso>
|
|
1362 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
1363 public EmitHelper conv_u
|
|
1364 {
|
|
1365 get { _ilGenerator.Emit(OpCodes.Conv_U); return this; }
|
|
1366 }
|
|
1367
|
|
1368 /// <summary>
|
|
1369 /// Calls ILGenerator.Emit(<see cref="OpCodes.Conv_U1"/>) that
|
|
1370 /// converts the value on top of the evaluation stack to unsigned int8, and extends it to int32.
|
|
1371 /// </summary>
|
|
1372 /// <seealso cref="OpCodes.Conv_U1">OpCodes.Conv_U1</seealso>
|
|
1373 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
1374 public EmitHelper conv_u1
|
|
1375 {
|
|
1376 get { _ilGenerator.Emit(OpCodes.Conv_U1); return this; }
|
|
1377 }
|
|
1378
|
|
1379 /// <summary>
|
|
1380 /// Calls ILGenerator.Emit(<see cref="OpCodes.Conv_U2"/>) that
|
|
1381 /// converts the value on top of the evaluation stack to unsigned int16, and extends it to int32.
|
|
1382 /// </summary>
|
|
1383 /// <seealso cref="OpCodes.Conv_U2">OpCodes.Conv_U2</seealso>
|
|
1384 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
1385 public EmitHelper conv_u2
|
|
1386 {
|
|
1387 get { _ilGenerator.Emit(OpCodes.Conv_U2); return this; }
|
|
1388 }
|
|
1389
|
|
1390 /// <summary>
|
|
1391 /// Calls ILGenerator.Emit(<see cref="OpCodes.Conv_U4"/>) that
|
|
1392 /// converts the value on top of the evaluation stack to unsigned int32, and extends it to int32.
|
|
1393 /// </summary>
|
|
1394 /// <seealso cref="OpCodes.Conv_U4">OpCodes.Conv_U4</seealso>
|
|
1395 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
1396 public EmitHelper conv_u4
|
|
1397 {
|
|
1398 get { _ilGenerator.Emit(OpCodes.Conv_U4); return this; }
|
|
1399 }
|
|
1400
|
|
1401 /// <summary>
|
|
1402 /// Calls ILGenerator.Emit(<see cref="OpCodes.Conv_U8"/>) that
|
|
1403 /// converts the value on top of the evaluation stack to unsigned int64, and extends it to int64.
|
|
1404 /// </summary>
|
|
1405 /// <seealso cref="OpCodes.Conv_U8">OpCodes.Conv_U8</seealso>
|
|
1406 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
1407 public EmitHelper conv_u8
|
|
1408 {
|
|
1409 get { _ilGenerator.Emit(OpCodes.Conv_U8); return this; }
|
|
1410 }
|
|
1411
|
|
1412 /// <summary>
|
|
1413 /// Calls ILGenerator.Emit(<see cref="OpCodes.Cpblk"/>) that
|
|
1414 /// copies a specified number bytes from a source address to a destination address.
|
|
1415 /// </summary>
|
|
1416 /// <seealso cref="OpCodes.Cpblk">OpCodes.Cpblk</seealso>
|
|
1417 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
1418 public EmitHelper cpblk
|
|
1419 {
|
|
1420 get { _ilGenerator.Emit(OpCodes.Cpblk); return this; }
|
|
1421 }
|
|
1422
|
|
1423 /// <summary>
|
|
1424 /// Calls ILGenerator.Emit(<see cref="OpCodes.Cpobj"/>, type) that
|
|
1425 /// copies the value type located at the address of an object (type &, * or natural int)
|
|
1426 /// to the address of the destination object (type &, * or natural int).
|
|
1427 /// </summary>
|
|
1428 /// <param name="type">A Type</param>
|
|
1429 /// <seealso cref="OpCodes.Cpobj">OpCodes.Cpobj</seealso>
|
|
1430 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,Type)">ILGenerator.Emit</seealso>
|
|
1431 public EmitHelper cpobj(Type type)
|
|
1432 {
|
|
1433 _ilGenerator.Emit(OpCodes.Cpobj, type); return this;
|
|
1434 }
|
|
1435
|
|
1436 /// <summary>
|
|
1437 /// Calls ILGenerator.Emit(<see cref="OpCodes.Div"/>) that
|
|
1438 /// divides two values and pushes the result as a floating-point (type F) or
|
|
1439 /// quotient (type int32) onto the evaluation stack.
|
|
1440 /// </summary>
|
|
1441 /// <seealso cref="OpCodes.Div">OpCodes.Div</seealso>
|
|
1442 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
1443 public EmitHelper div
|
|
1444 {
|
|
1445 get { _ilGenerator.Emit(OpCodes.Div); return this; }
|
|
1446 }
|
|
1447
|
|
1448 /// <summary>
|
|
1449 /// Calls ILGenerator.Emit(<see cref="OpCodes.Div_Un"/>) that
|
|
1450 /// divides two unsigned integer values and pushes the result (int32) onto the evaluation stack.
|
|
1451 /// </summary>
|
|
1452 /// <seealso cref="OpCodes.Div_Un">OpCodes.Div_Un</seealso>
|
|
1453 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
1454 public EmitHelper div_un
|
|
1455 {
|
|
1456 get { _ilGenerator.Emit(OpCodes.Div_Un); return this; }
|
|
1457 }
|
|
1458
|
|
1459 /// <summary>
|
|
1460 /// Calls ILGenerator.Emit(<see cref="OpCodes.Dup"/>) that
|
|
1461 /// copies the current topmost value on the evaluation stack, and then pushes the copy onto the evaluation stack.
|
|
1462 /// </summary>
|
|
1463 /// <seealso cref="OpCodes.Dup">OpCodes.Dup</seealso>
|
|
1464 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
1465 public EmitHelper dup
|
|
1466 {
|
|
1467 get { _ilGenerator.Emit(OpCodes.Dup); return this; }
|
|
1468 }
|
|
1469
|
|
1470 /// <summary>
|
|
1471 /// Calls ILGenerator.Emit(<see cref="OpCodes.Endfilter"/>) that
|
|
1472 /// transfers control from the filter clause of an exception back to
|
|
1473 /// the Common Language Infrastructure (CLI) exception handler.
|
|
1474 /// </summary>
|
|
1475 /// <seealso cref="OpCodes.Endfilter">OpCodes.Endfilter</seealso>
|
|
1476 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
1477 public EmitHelper endfilter
|
|
1478 {
|
|
1479 get { _ilGenerator.Emit(OpCodes.Endfilter); return this; }
|
|
1480 }
|
|
1481
|
|
1482 /// <summary>
|
|
1483 /// Calls ILGenerator.Emit(<see cref="OpCodes.Endfinally"/>) that
|
|
1484 /// transfers control from the fault or finally clause of an exception block back to
|
|
1485 /// the Common Language Infrastructure (CLI) exception handler.
|
|
1486 /// </summary>
|
|
1487 /// <seealso cref="OpCodes.Endfinally">OpCodes.Endfinally</seealso>
|
|
1488 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
1489 public EmitHelper endfinally
|
|
1490 {
|
|
1491 get { _ilGenerator.Emit(OpCodes.Endfinally); return this; }
|
|
1492 }
|
|
1493
|
|
1494 /// <summary>
|
|
1495 /// Calls ILGenerator.Emit(<see cref="OpCodes.Initblk"/>) that
|
|
1496 /// initializes a specified block of memory at a specific address to a given size and initial value.
|
|
1497 /// </summary>
|
|
1498 /// <seealso cref="OpCodes.Initblk">OpCodes.Initblk</seealso>
|
|
1499 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
1500 public EmitHelper initblk
|
|
1501 {
|
|
1502 get { _ilGenerator.Emit(OpCodes.Initblk); return this; }
|
|
1503 }
|
|
1504
|
|
1505 /// <summary>
|
|
1506 /// Calls ILGenerator.Emit(<see cref="OpCodes.Initobj"/>, type) that
|
|
1507 /// initializes all the fields of the object at a specific address to a null reference or
|
|
1508 /// a 0 of the appropriate primitive type.
|
|
1509 /// </summary>
|
|
1510 /// <param name="type">A Type</param>
|
|
1511 /// <seealso cref="OpCodes.Initobj">OpCodes.Initobj</seealso>
|
|
1512 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,Type)">ILGenerator.Emit</seealso>
|
|
1513 public EmitHelper initobj(Type type)
|
|
1514 {
|
|
1515 _ilGenerator.Emit(OpCodes.Initobj, type); return this;
|
|
1516 }
|
|
1517
|
|
1518 /// <summary>
|
|
1519 /// Calls ILGenerator.Emit(<see cref="OpCodes.Isinst"/>, type) that
|
|
1520 /// tests whether an object reference (type O) is an instance of a particular class.
|
|
1521 /// </summary>
|
|
1522 /// <param name="type">A Type</param>
|
|
1523 /// <seealso cref="OpCodes.Isinst">OpCodes.Isinst</seealso>
|
|
1524 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,Type)">ILGenerator.Emit</seealso>
|
|
1525 public EmitHelper isinst(Type type)
|
|
1526 {
|
|
1527 _ilGenerator.Emit(OpCodes.Isinst, type); return this;
|
|
1528 }
|
|
1529
|
|
1530 /// <summary>
|
|
1531 /// Calls ILGenerator.Emit(<see cref="OpCodes.Jmp"/>, methodInfo) that
|
|
1532 /// exits current method and jumps to specified method.
|
|
1533 /// </summary>
|
|
1534 /// <param name="methodInfo">The method to be jumped.</param>
|
|
1535 /// <seealso cref="OpCodes.Jmp">OpCodes.Jmp</seealso>
|
|
1536 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,MethodInfo)">ILGenerator.Emit</seealso>
|
|
1537 public EmitHelper jmp(MethodInfo methodInfo)
|
|
1538 {
|
|
1539 _ilGenerator.Emit(OpCodes.Jmp, methodInfo); return this;
|
|
1540 }
|
|
1541
|
|
1542 /// <summary>
|
|
1543 /// Calls ILGenerator.Emit(<see cref="OpCodes.Ldarg"/>, short) that
|
|
1544 /// loads an argument (referenced by a specified index value) onto the stack.
|
|
1545 /// </summary>
|
|
1546 /// <param name="index">Index of the argument that is pushed onto the stack.</param>
|
|
1547 /// <seealso cref="OpCodes.Ldarg">OpCodes.Ldarg</seealso>
|
|
1548 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,short)">ILGenerator.Emit</seealso>
|
|
1549 public EmitHelper ldarg(short index)
|
|
1550 {
|
|
1551 _ilGenerator.Emit(OpCodes.Ldarg, index); return this;
|
|
1552 }
|
|
1553
|
|
1554 /// <summary>
|
|
1555 /// Loads an argument onto the stack.
|
|
1556 /// </summary>
|
|
1557 /// <param name="parameterInfo">A <see cref="ParameterInfo"/> representing a parameter.</param>
|
|
1558 /// <param name="box">True, if parameter must be converted to a reference.</param>
|
|
1559 /// <seealso cref="ldarg(ParameterInfo)"/>
|
|
1560 public EmitHelper ldargEx(ParameterInfo parameterInfo, bool box)
|
|
1561 {
|
|
1562 ldarg(parameterInfo);
|
|
1563
|
|
1564 Type type = parameterInfo.ParameterType;
|
|
1565
|
|
1566 if (parameterInfo.ParameterType.IsByRef)
|
|
1567 type = parameterInfo.ParameterType.GetElementType();
|
|
1568
|
|
1569 if (parameterInfo.ParameterType.IsByRef)
|
|
1570 {
|
|
1571 if (type.IsValueType && type.IsPrimitive == false)
|
|
1572 ldobj(type);
|
|
1573 else
|
|
1574 ldind(type);
|
|
1575 }
|
|
1576
|
|
1577 if (box)
|
|
1578 boxIfValueType(type);
|
|
1579
|
|
1580 return this;
|
|
1581 }
|
|
1582
|
|
1583 /// <summary>
|
|
1584 /// Calls ILGenerator.Emit(<see cref="OpCodes.Ldarg"/>, short) or
|
|
1585 /// ILGenerator.Emit(<see cref="OpCodes.Ldarg_S"/>, byte) that
|
|
1586 /// loads an argument (referenced by a specified index value) onto the stack.
|
|
1587 /// </summary>
|
|
1588 /// <param name="index">Index of the argument that is pushed onto the stack.</param>
|
|
1589 /// <seealso cref="OpCodes.Ldarg">OpCodes.Ldarg</seealso>
|
|
1590 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,short)">ILGenerator.Emit</seealso>
|
|
1591 public EmitHelper ldarg(int index)
|
|
1592 {
|
|
1593 switch (index)
|
|
1594 {
|
|
1595 case 0: ldarg_0.end(); break;
|
|
1596 case 1: ldarg_1.end(); break;
|
|
1597 case 2: ldarg_2.end(); break;
|
|
1598 case 3: ldarg_3.end(); break;
|
|
1599 default:
|
|
1600 if (index <= byte. MaxValue) ldarg_s((byte)index);
|
|
1601 else if (index <= short.MaxValue) ldarg ((short)index);
|
|
1602 else
|
|
1603 throw new ArgumentOutOfRangeException("index");
|
|
1604
|
|
1605 break;
|
|
1606 }
|
|
1607
|
|
1608 return this;
|
|
1609 }
|
|
1610
|
|
1611 /// <summary>
|
|
1612 /// Loads an argument onto the stack.
|
|
1613 /// </summary>
|
|
1614 /// <param name="parameterInfo">A <see cref="ParameterInfo"/> representing a parameter.</param>
|
|
1615 public EmitHelper ldarg(ParameterInfo parameterInfo)
|
|
1616 {
|
|
1617 if (parameterInfo == null) throw new ArgumentNullException("parameterInfo");
|
|
1618
|
|
1619 bool isStatic =
|
|
1620 Method is MethodBuilderHelper && ((MethodBuilderHelper)Method).MethodBuilder.IsStatic;
|
|
1621
|
|
1622 return ldarg(parameterInfo.Position + (isStatic? 0: 1));
|
|
1623 }
|
|
1624
|
|
1625 /// <summary>
|
|
1626 /// Calls ILGenerator.Emit(<see cref="OpCodes.Ldarga"/>, short) that
|
|
1627 /// load an argument address onto the evaluation stack.
|
|
1628 /// </summary>
|
|
1629 /// <param name="index">Index of the address addr of the argument that is pushed onto the stack.</param>
|
|
1630 /// <seealso cref="OpCodes.Ldarga">OpCodes.Ldarga</seealso>
|
|
1631 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,short)">ILGenerator.Emit</seealso>
|
|
1632 public EmitHelper ldarga(short index)
|
|
1633 {
|
|
1634 _ilGenerator.Emit(OpCodes.Ldarga, index); return this;
|
|
1635 }
|
|
1636
|
|
1637 /// <summary>
|
|
1638 /// Calls ILGenerator.Emit(<see cref="OpCodes.Ldarga_S"/>, byte) that
|
|
1639 /// load an argument address, in short form, onto the evaluation stack.
|
|
1640 /// </summary>
|
|
1641 /// <param name="index">Index of the address addr of the argument that is pushed onto the stack.</param>
|
|
1642 /// <seealso cref="OpCodes.Ldarga_S">OpCodes.Ldarga_S</seealso>
|
|
1643 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,byte)">ILGenerator.Emit</seealso>
|
|
1644 public EmitHelper ldarga_s(byte index)
|
|
1645 {
|
|
1646 _ilGenerator.Emit(OpCodes.Ldarga_S, index); return this;
|
|
1647 }
|
|
1648
|
|
1649 /// <summary>
|
|
1650 /// Load an argument address onto the evaluation stack.
|
|
1651 /// </summary>
|
|
1652 /// <param name="index">Index of the address addr of the argument that is pushed onto the stack.</param>
|
|
1653 public EmitHelper ldarga(int index)
|
|
1654 {
|
|
1655 if (index <= byte. MaxValue) ldarga_s((byte)index);
|
|
1656 else if (index <= short.MaxValue) ldarga ((short)index);
|
|
1657 else
|
|
1658 throw new ArgumentOutOfRangeException("index");
|
|
1659
|
|
1660 return this;
|
|
1661 }
|
|
1662
|
|
1663 /// <summary>
|
|
1664 /// Loads an argument address onto the stack.
|
|
1665 /// </summary>
|
|
1666 /// <param name="parameterInfo">A <see cref="ParameterInfo"/> representing a parameter.</param>
|
|
1667 public EmitHelper ldarga(ParameterInfo parameterInfo)
|
|
1668 {
|
|
1669 if (parameterInfo == null) throw new ArgumentNullException("parameterInfo");
|
|
1670
|
|
1671 bool isStatic =
|
|
1672 Method is MethodBuilderHelper && ((MethodBuilderHelper)Method).MethodBuilder.IsStatic;
|
|
1673
|
|
1674 return ldarga(parameterInfo.Position + (isStatic? 0: 1));
|
|
1675 }
|
|
1676
|
|
1677
|
|
1678 /// <summary>
|
|
1679 /// Calls ILGenerator.Emit(<see cref="OpCodes.Ldarg_0"/>) that
|
|
1680 /// loads the argument at index 0 onto the evaluation stack.
|
|
1681 /// </summary>
|
|
1682 /// <seealso cref="OpCodes.Ldarg_0">OpCodes.Ldarg_0</seealso>
|
|
1683 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
1684 public EmitHelper ldarg_0
|
|
1685 {
|
|
1686 get { _ilGenerator.Emit(OpCodes.Ldarg_0); return this; }
|
|
1687 }
|
|
1688
|
|
1689 /// <summary>
|
|
1690 /// Calls ILGenerator.Emit(<see cref="OpCodes.Ldarg_1"/>) that
|
|
1691 /// loads the argument at index 1 onto the evaluation stack.
|
|
1692 /// </summary>
|
|
1693 /// <seealso cref="OpCodes.Ldarg_1">OpCodes.Ldarg_1</seealso>
|
|
1694 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
1695 public EmitHelper ldarg_1
|
|
1696 {
|
|
1697 get { _ilGenerator.Emit(OpCodes.Ldarg_1); return this; }
|
|
1698 }
|
|
1699
|
|
1700 /// <summary>
|
|
1701 /// Calls ILGenerator.Emit(<see cref="OpCodes.Ldarg_2"/>) that
|
|
1702 /// loads the argument at index 2 onto the evaluation stack.
|
|
1703 /// </summary>
|
|
1704 /// <seealso cref="OpCodes.Ldarg_2">OpCodes.Ldarg_2</seealso>
|
|
1705 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
1706 public EmitHelper ldarg_2
|
|
1707 {
|
|
1708 get { _ilGenerator.Emit(OpCodes.Ldarg_2); return this; }
|
|
1709 }
|
|
1710
|
|
1711 /// <summary>
|
|
1712 /// Calls ILGenerator.Emit(<see cref="OpCodes.Ldarg_3"/>) that
|
|
1713 /// loads the argument at index 3 onto the evaluation stack.
|
|
1714 /// </summary>
|
|
1715 /// <seealso cref="OpCodes.Ldarg_3">OpCodes.Ldarg_3</seealso>
|
|
1716 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
1717 public EmitHelper ldarg_3
|
|
1718 {
|
|
1719 get { _ilGenerator.Emit(OpCodes.Ldarg_3); return this; }
|
|
1720 }
|
|
1721
|
|
1722 /// <summary>
|
|
1723 /// Calls ILGenerator.Emit(<see cref="OpCodes.Ldarg_S"/>, byte) that
|
|
1724 /// loads the argument (referenced by a specified short form index) onto the evaluation stack.
|
|
1725 /// </summary>
|
|
1726 /// <param name="index">Index of the argument value that is pushed onto the stack.</param>
|
|
1727 /// <seealso cref="OpCodes.Ldarg_S">OpCodes.Ldarg_S</seealso>
|
|
1728 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,byte)">ILGenerator.Emit</seealso>
|
|
1729 public EmitHelper ldarg_s(byte index)
|
|
1730 {
|
|
1731 _ilGenerator.Emit(OpCodes.Ldarg_S, index); return this;
|
|
1732 }
|
|
1733
|
|
1734 /// <summary>
|
|
1735 /// Calls ILGenerator.Emit(<see cref="OpCodes.Ldc_I4_0"/> or <see cref="OpCodes.Ldc_I4_1"/>) that
|
|
1736 /// pushes a supplied value of type int32 onto the evaluation stack as an int32.
|
|
1737 /// </summary>
|
|
1738 /// <param name="b">The value pushed onto the stack.</param>
|
|
1739 /// <seealso cref="OpCodes.Ldc_I4">OpCodes.Ldc_I4_0</seealso>
|
|
1740 /// <seealso cref="OpCodes.Ldc_I4">OpCodes.Ldc_I4_1</seealso>
|
|
1741 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,int)">ILGenerator.Emit</seealso>
|
|
1742 public EmitHelper ldc_bool(bool b)
|
|
1743 {
|
|
1744 _ilGenerator.Emit(b? OpCodes.Ldc_I4_1: OpCodes.Ldc_I4_0); return this;
|
|
1745 }
|
|
1746
|
|
1747 /// <summary>
|
|
1748 /// Calls ILGenerator.Emit(<see cref="OpCodes.Ldc_I4"/>, int) that
|
|
1749 /// pushes a supplied value of type int32 onto the evaluation stack as an int32.
|
|
1750 /// </summary>
|
|
1751 /// <param name="num">The value pushed onto the stack.</param>
|
|
1752 /// <seealso cref="OpCodes.Ldc_I4">OpCodes.Ldc_I4</seealso>
|
|
1753 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,int)">ILGenerator.Emit</seealso>
|
|
1754 public EmitHelper ldc_i4(int num)
|
|
1755 {
|
|
1756 _ilGenerator.Emit(OpCodes.Ldc_I4, num); return this;
|
|
1757 }
|
|
1758
|
|
1759 /// <summary>
|
|
1760 /// Calls ILGenerator.Emit(<see cref="OpCodes.Ldc_I4_0"/>) that
|
|
1761 /// pushes the integer value of 0 onto the evaluation stack as an int32.
|
|
1762 /// </summary>
|
|
1763 /// <seealso cref="OpCodes.Ldc_I4_0">OpCodes.Ldc_I4_0</seealso>
|
|
1764 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
1765 public EmitHelper ldc_i4_0
|
|
1766 {
|
|
1767 get { _ilGenerator.Emit(OpCodes.Ldc_I4_0); return this; }
|
|
1768 }
|
|
1769
|
|
1770 /// <summary>
|
|
1771 /// Calls ILGenerator.Emit(<see cref="OpCodes.Ldc_I4_1"/>) that
|
|
1772 /// pushes the integer value of 1 onto the evaluation stack as an int32.
|
|
1773 /// </summary>
|
|
1774 /// <seealso cref="OpCodes.Ldc_I4_1">OpCodes.Ldc_I4_1</seealso>
|
|
1775 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
1776 public EmitHelper ldc_i4_1
|
|
1777 {
|
|
1778 get { _ilGenerator.Emit(OpCodes.Ldc_I4_1); return this; }
|
|
1779 }
|
|
1780
|
|
1781 /// <summary>
|
|
1782 /// Calls ILGenerator.Emit(<see cref="OpCodes.Ldc_I4_2"/>) that
|
|
1783 /// pushes the integer value of 2 onto the evaluation stack as an int32.
|
|
1784 /// </summary>
|
|
1785 /// <seealso cref="OpCodes.Ldc_I4_2">OpCodes.Ldc_I4_2</seealso>
|
|
1786 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
1787 public EmitHelper ldc_i4_2
|
|
1788 {
|
|
1789 get { _ilGenerator.Emit(OpCodes.Ldc_I4_2); return this; }
|
|
1790 }
|
|
1791
|
|
1792 /// <summary>
|
|
1793 /// Calls ILGenerator.Emit(<see cref="OpCodes.Ldc_I4_3"/>) that
|
|
1794 /// pushes the integer value of 3 onto the evaluation stack as an int32.
|
|
1795 /// </summary>
|
|
1796 /// <seealso cref="OpCodes.Ldc_I4_3">OpCodes.Ldc_I4_3</seealso>
|
|
1797 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
1798 public EmitHelper ldc_i4_3
|
|
1799 {
|
|
1800 get { _ilGenerator.Emit(OpCodes.Ldc_I4_3); return this; }
|
|
1801 }
|
|
1802
|
|
1803 /// <summary>
|
|
1804 /// Calls ILGenerator.Emit(<see cref="OpCodes.Ldc_I4_4"/>) that
|
|
1805 /// pushes the integer value of 4 onto the evaluation stack as an int32.
|
|
1806 /// </summary>
|
|
1807 /// <seealso cref="OpCodes.Ldc_I4_4">OpCodes.Ldc_I4_4</seealso>
|
|
1808 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
1809 public EmitHelper ldc_i4_4
|
|
1810 {
|
|
1811 get { _ilGenerator.Emit(OpCodes.Ldc_I4_4); return this; }
|
|
1812 }
|
|
1813
|
|
1814 /// <summary>
|
|
1815 /// Calls ILGenerator.Emit(<see cref="OpCodes.Ldc_I4_5"/>) that
|
|
1816 /// pushes the integer value of 5 onto the evaluation stack as an int32.
|
|
1817 /// </summary>
|
|
1818 /// <seealso cref="OpCodes.Ldc_I4_5">OpCodes.Ldc_I4_0</seealso>
|
|
1819 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
1820 public EmitHelper ldc_i4_5
|
|
1821 {
|
|
1822 get { _ilGenerator.Emit(OpCodes.Ldc_I4_5); return this; }
|
|
1823 }
|
|
1824
|
|
1825 /// <summary>
|
|
1826 /// Calls ILGenerator.Emit(<see cref="OpCodes.Ldc_I4_6"/>) that
|
|
1827 /// pushes the integer value of 6 onto the evaluation stack as an int32.
|
|
1828 /// </summary>
|
|
1829 /// <seealso cref="OpCodes.Ldc_I4_6">OpCodes.Ldc_I4_6</seealso>
|
|
1830 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
1831 public EmitHelper ldc_i4_6
|
|
1832 {
|
|
1833 get { _ilGenerator.Emit(OpCodes.Ldc_I4_6); return this; }
|
|
1834 }
|
|
1835
|
|
1836 /// <summary>
|
|
1837 /// Calls ILGenerator.Emit(<see cref="OpCodes.Ldc_I4_7"/>) that
|
|
1838 /// pushes the integer value of 7 onto the evaluation stack as an int32.
|
|
1839 /// </summary>
|
|
1840 /// <seealso cref="OpCodes.Ldc_I4_7">OpCodes.Ldc_I4_7</seealso>
|
|
1841 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
1842 public EmitHelper ldc_i4_7
|
|
1843 {
|
|
1844 get { _ilGenerator.Emit(OpCodes.Ldc_I4_7); return this; }
|
|
1845 }
|
|
1846
|
|
1847 /// <summary>
|
|
1848 /// Calls ILGenerator.Emit(<see cref="OpCodes.Ldc_I4_8"/>) that
|
|
1849 /// pushes the integer value of 8 onto the evaluation stack as an int32.
|
|
1850 /// </summary>
|
|
1851 /// <seealso cref="OpCodes.Ldc_I4_8">OpCodes.Ldc_I4_8</seealso>
|
|
1852 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
1853 public EmitHelper ldc_i4_8
|
|
1854 {
|
|
1855 get { _ilGenerator.Emit(OpCodes.Ldc_I4_8); return this; }
|
|
1856 }
|
|
1857
|
|
1858 /// <summary>
|
|
1859 /// Calls ILGenerator.Emit(<see cref="OpCodes.Ldc_I4_M1"/>) that
|
|
1860 /// pushes the integer value of -1 onto the evaluation stack as an int32.
|
|
1861 /// </summary>
|
|
1862 /// <seealso cref="OpCodes.Ldc_I4_M1">OpCodes.Ldc_I4_M1</seealso>
|
|
1863 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
1864 public EmitHelper ldc_i4_m1
|
|
1865 {
|
|
1866 get { _ilGenerator.Emit(OpCodes.Ldc_I4_M1); return this; }
|
|
1867 }
|
|
1868
|
|
1869 /// <summary>
|
|
1870 /// Calls the best form of ILGenerator.Emit(Ldc_I4_X) that
|
|
1871 /// pushes the integer value of -1 onto the evaluation stack as an int32.
|
|
1872 /// </summary>
|
|
1873 /// <seealso cref="ldc_i4"/>
|
|
1874 public EmitHelper ldc_i4_(int num)
|
|
1875 {
|
|
1876 switch (num)
|
|
1877 {
|
|
1878 case -1: ldc_i4_m1.end(); break;
|
|
1879 case 0: ldc_i4_0. end(); break;
|
|
1880 case 1: ldc_i4_1. end(); break;
|
|
1881 case 2: ldc_i4_2. end(); break;
|
|
1882 case 3: ldc_i4_3. end(); break;
|
|
1883 case 4: ldc_i4_4. end(); break;
|
|
1884 case 5: ldc_i4_5. end(); break;
|
|
1885 case 6: ldc_i4_6. end(); break;
|
|
1886 case 7: ldc_i4_7. end(); break;
|
|
1887 case 8: ldc_i4_8. end(); break;
|
|
1888 default:
|
|
1889 if (num >= sbyte.MinValue && num <= sbyte.MaxValue)
|
|
1890 ldc_i4_s((sbyte)num);
|
|
1891 else
|
|
1892 ldc_i4 (num);
|
|
1893
|
|
1894 break;
|
|
1895 }
|
|
1896
|
|
1897 return this;
|
|
1898 }
|
|
1899
|
|
1900 /// <summary>
|
|
1901 /// Calls ILGenerator.Emit(<see cref="OpCodes.Ldc_I4_S"/>, byte) that
|
|
1902 /// pushes the supplied int8 value onto the evaluation stack as an int32, short form.
|
|
1903 /// </summary>
|
|
1904 /// <param name="num">The value pushed onto the stack.</param>
|
|
1905 /// <seealso cref="OpCodes.Ldc_I4_S">OpCodes.Ldc_I4_S</seealso>
|
|
1906 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,byte)">ILGenerator.Emit</seealso>
|
|
1907 [CLSCompliant(false)]
|
|
1908 public EmitHelper ldc_i4_s(sbyte num)
|
|
1909 {
|
|
1910 _ilGenerator.Emit(OpCodes.Ldc_I4_S, num); return this;
|
|
1911 }
|
|
1912
|
|
1913 /// <summary>
|
|
1914 /// Calls ILGenerator.Emit(<see cref="OpCodes.Ldc_I8"/>, long) that
|
|
1915 /// pushes a supplied value of type int64 onto the evaluation stack as an int64.
|
|
1916 /// </summary>
|
|
1917 /// <param name="num">The value pushed onto the stack.</param>
|
|
1918 /// <seealso cref="OpCodes.Ldc_I8">OpCodes.Ldc_I8</seealso>
|
|
1919 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,long)">ILGenerator.Emit</seealso>
|
|
1920 public EmitHelper ldc_i8(long num)
|
|
1921 {
|
|
1922 _ilGenerator.Emit(OpCodes.Ldc_I8, num); return this;
|
|
1923 }
|
|
1924
|
|
1925 /// <summary>
|
|
1926 /// Calls ILGenerator.Emit(<see cref="OpCodes.Ldc_R4"/>, float) that
|
|
1927 /// pushes a supplied value of type float32 onto the evaluation stack as type F (float).
|
|
1928 /// </summary>
|
|
1929 /// <param name="num">The value pushed onto the stack.</param>
|
|
1930 /// <seealso cref="OpCodes.Ldc_R4">OpCodes.Ldc_R4</seealso>
|
|
1931 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,float)">ILGenerator.Emit</seealso>
|
|
1932 public EmitHelper ldc_r4(float num)
|
|
1933 {
|
|
1934 _ilGenerator.Emit(OpCodes.Ldc_R4, num); return this;
|
|
1935 }
|
|
1936
|
|
1937 /// <summary>
|
|
1938 /// Calls ILGenerator.Emit(<see cref="OpCodes.Ldc_R8"/>, double) that
|
|
1939 /// pushes a supplied value of type float64 onto the evaluation stack as type F (float).
|
|
1940 /// </summary>
|
|
1941 /// <param name="num">The value pushed onto the stack.</param>
|
|
1942 /// <seealso cref="OpCodes.Ldc_R8">OpCodes.Ldc_R8</seealso>
|
|
1943 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,double)">ILGenerator.Emit</seealso>
|
|
1944 public EmitHelper ldc_r8(double num)
|
|
1945 {
|
|
1946 _ilGenerator.Emit(OpCodes.Ldc_R8, num); return this;
|
|
1947 }
|
|
1948
|
|
1949 /// <summary>
|
|
1950 /// Calls ILGenerator.Emit(<see cref="OpCodes.Ldelema"/>, type) that
|
|
1951 /// loads the address of the array element at a specified array index onto the top of the evaluation stack
|
|
1952 /// as type & (managed pointer).
|
|
1953 /// </summary>
|
|
1954 /// <param name="type">A Type</param>
|
|
1955 /// <seealso cref="OpCodes.Ldelema">OpCodes.Ldelema</seealso>
|
|
1956 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,Type)">ILGenerator.Emit</seealso>
|
|
1957 public EmitHelper ldelema(Type type)
|
|
1958 {
|
|
1959 _ilGenerator.Emit(OpCodes.Ldelema, type); return this;
|
|
1960 }
|
|
1961
|
|
1962 /// <summary>
|
|
1963 /// Calls ILGenerator.Emit(<see cref="OpCodes.Ldelem_I"/>) that
|
|
1964 /// loads the element with type natural int at a specified array index onto the top of the evaluation stack
|
|
1965 /// as a natural int.
|
|
1966 /// </summary>
|
|
1967 /// <seealso cref="OpCodes.Ldelem_I">OpCodes.Ldelem_I</seealso>
|
|
1968 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
1969 public EmitHelper ldelem_i
|
|
1970 {
|
|
1971 get { _ilGenerator.Emit(OpCodes.Ldelem_I); return this; }
|
|
1972 }
|
|
1973
|
|
1974 /// <summary>
|
|
1975 /// Calls ILGenerator.Emit(<see cref="OpCodes.Ldelem_I1"/>) that
|
|
1976 /// loads the element with type int8 at a specified array index onto the top of the evaluation stack as an int32.
|
|
1977 /// </summary>
|
|
1978 /// <seealso cref="OpCodes.Ldelem_I1">OpCodes.Ldelem_I1</seealso>
|
|
1979 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
1980 public EmitHelper ldelem_i1
|
|
1981 {
|
|
1982 get { _ilGenerator.Emit(OpCodes.Ldelem_I1); return this; }
|
|
1983 }
|
|
1984
|
|
1985 /// <summary>
|
|
1986 /// Calls ILGenerator.Emit(<see cref="OpCodes.Ldelem_I2"/>) that
|
|
1987 /// loads the element with type int16 at a specified array index onto the top of the evaluation stack as an int32.
|
|
1988 /// </summary>
|
|
1989 /// <seealso cref="OpCodes.Ldelem_I2">OpCodes.Ldelem_I2</seealso>
|
|
1990 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
1991 public EmitHelper ldelem_i2
|
|
1992 {
|
|
1993 get { _ilGenerator.Emit(OpCodes.Ldelem_I2); return this; }
|
|
1994 }
|
|
1995
|
|
1996 /// <summary>
|
|
1997 /// Calls ILGenerator.Emit(<see cref="OpCodes.Ldelem_I4"/>) that
|
|
1998 /// loads the element with type int32 at a specified array index onto the top of the evaluation stack as an int32.
|
|
1999 /// </summary>
|
|
2000 /// <seealso cref="OpCodes.Ldelem_I4">OpCodes.Ldelem_I4</seealso>
|
|
2001 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
2002 public EmitHelper ldelem_i4
|
|
2003 {
|
|
2004 get { _ilGenerator.Emit(OpCodes.Ldelem_I4); return this; }
|
|
2005 }
|
|
2006
|
|
2007 /// <summary>
|
|
2008 /// Calls ILGenerator.Emit(<see cref="OpCodes.Ldelem_I8"/>) that
|
|
2009 /// loads the element with type int64 at a specified array index onto the top of the evaluation stack as an int64.
|
|
2010 /// </summary>
|
|
2011 /// <seealso cref="OpCodes.Ldelem_I8">OpCodes.Ldelem_I8</seealso>
|
|
2012 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
2013 public EmitHelper ldelem_i8
|
|
2014 {
|
|
2015 get { _ilGenerator.Emit(OpCodes.Ldelem_I8); return this; }
|
|
2016 }
|
|
2017
|
|
2018 /// <summary>
|
|
2019 /// Calls ILGenerator.Emit(<see cref="OpCodes.Ldelem_R4"/>) that
|
|
2020 /// loads the element with type float32 at a specified array index onto the top of the evaluation stack as type F (float).
|
|
2021 /// </summary>
|
|
2022 /// <seealso cref="OpCodes.Ldelem_R4">OpCodes.Ldelem_R4</seealso>
|
|
2023 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
2024 public EmitHelper ldelem_r4
|
|
2025 {
|
|
2026 get { _ilGenerator.Emit(OpCodes.Ldelem_R4); return this; }
|
|
2027 }
|
|
2028
|
|
2029 /// <summary>
|
|
2030 /// Calls ILGenerator.Emit(<see cref="OpCodes.Ldelem_R8"/>) that
|
|
2031 /// loads the element with type float64 at a specified array index onto the top of the evaluation stack as type F (float).
|
|
2032 /// </summary>
|
|
2033 /// <seealso cref="OpCodes.Ldelem_R8">OpCodes.Ldelem_R8</seealso>
|
|
2034 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
2035 public EmitHelper ldelem_r8
|
|
2036 {
|
|
2037 get { _ilGenerator.Emit(OpCodes.Ldelem_R8); return this; }
|
|
2038 }
|
|
2039
|
|
2040 /// <summary>
|
|
2041 /// Calls ILGenerator.Emit(<see cref="OpCodes.Ldelem_Ref"/>) that
|
|
2042 /// loads the element containing an object reference at a specified array index
|
|
2043 /// onto the top of the evaluation stack as type O (object reference).
|
|
2044 /// </summary>
|
|
2045 /// <seealso cref="OpCodes.Ldelem_Ref">OpCodes.Ldelem_Ref</seealso>
|
|
2046 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
2047 public EmitHelper ldelem_ref
|
|
2048 {
|
|
2049 get { _ilGenerator.Emit(OpCodes.Ldelem_Ref); return this; }
|
|
2050 }
|
|
2051
|
|
2052 /// <summary>
|
|
2053 /// Calls ILGenerator.Emit(<see cref="OpCodes.Ldelem_U1"/>) that
|
|
2054 /// loads the element with type unsigned int8 at a specified array index onto the top of the evaluation stack as an int32.
|
|
2055 /// </summary>
|
|
2056 /// <seealso cref="OpCodes.Ldelem_U1">OpCodes.Ldelem_U1</seealso>
|
|
2057 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
2058 public EmitHelper ldelem_u1
|
|
2059 {
|
|
2060 get { _ilGenerator.Emit(OpCodes.Ldelem_U1); return this; }
|
|
2061 }
|
|
2062
|
|
2063 /// <summary>
|
|
2064 /// Calls ILGenerator.Emit(<see cref="OpCodes.Ldelem_U2"/>) that
|
|
2065 /// loads the element with type unsigned int16 at a specified array index
|
|
2066 /// onto the top of the evaluation stack as an int32.
|
|
2067 /// </summary>
|
|
2068 /// <seealso cref="OpCodes.Ldelem_U2">OpCodes.Ldelem_U2</seealso>
|
|
2069 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
2070 public EmitHelper ldelem_u2
|
|
2071 {
|
|
2072 get { _ilGenerator.Emit(OpCodes.Ldelem_U2); return this; }
|
|
2073 }
|
|
2074
|
|
2075 /// <summary>
|
|
2076 /// Calls ILGenerator.Emit(<see cref="OpCodes.Ldelem_U4"/>) that
|
|
2077 /// loads the element with type unsigned int32 at a specified array index
|
|
2078 /// onto the top of the evaluation stack as an int32.
|
|
2079 /// </summary>
|
|
2080 /// <seealso cref="OpCodes.Ldelem_U4">OpCodes.Ldelem_U4</seealso>
|
|
2081 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
2082 public EmitHelper ldelem_u4
|
|
2083 {
|
|
2084 get { _ilGenerator.Emit(OpCodes.Ldelem_U4); return this; }
|
|
2085 }
|
|
2086
|
|
2087 /// <summary>
|
|
2088 /// Calls ILGenerator.Emit(<see cref="OpCodes.Ldfld"/>, fieldInfo) that
|
|
2089 /// finds the value of a field in the object whose reference is currently on the evaluation stack.
|
|
2090 /// </summary>
|
|
2091 /// <param name="fieldInfo">A <see cref="FieldInfo"/> representing a field.</param>
|
|
2092 /// <seealso cref="OpCodes.Ldfld">OpCodes.Ldfld</seealso>
|
|
2093 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,FieldInfo)">ILGenerator.Emit</seealso>
|
|
2094 public EmitHelper ldfld(FieldInfo fieldInfo)
|
|
2095 {
|
|
2096 _ilGenerator.Emit(OpCodes.Ldfld, fieldInfo); return this;
|
|
2097 }
|
|
2098
|
|
2099 /// <summary>
|
|
2100 /// Calls ILGenerator.Emit(<see cref="OpCodes.Ldflda"/>, fieldInfo) that
|
|
2101 /// finds the address of a field in the object whose reference is currently on the evaluation stack.
|
|
2102 /// </summary>
|
|
2103 /// <param name="fieldInfo">A <see cref="FieldInfo"/> representing a field.</param>
|
|
2104 /// <seealso cref="OpCodes.Ldflda">OpCodes.Ldflda</seealso>
|
|
2105 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,FieldInfo)">ILGenerator.Emit</seealso>
|
|
2106 public EmitHelper ldflda(FieldInfo fieldInfo)
|
|
2107 {
|
|
2108 _ilGenerator.Emit(OpCodes.Ldflda, fieldInfo); return this;
|
|
2109 }
|
|
2110
|
|
2111 /// <summary>
|
|
2112 /// Calls ILGenerator.Emit(<see cref="OpCodes.Ldftn"/>, methodInfo) that
|
|
2113 /// pushes an unmanaged pointer (type natural int) to the native code implementing a specific method
|
|
2114 /// onto the evaluation stack.
|
|
2115 /// </summary>
|
|
2116 /// <param name="methodInfo">The method to be called.</param>
|
|
2117 /// <seealso cref="OpCodes.Ldftn">OpCodes.Ldftn</seealso>
|
|
2118 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,MethodInfo)">ILGenerator.Emit</seealso>
|
|
2119 public EmitHelper ldftn(MethodInfo methodInfo)
|
|
2120 {
|
|
2121 _ilGenerator.Emit(OpCodes.Ldftn, methodInfo); return this;
|
|
2122 }
|
|
2123
|
|
2124 /// <summary>
|
|
2125 /// Calls ILGenerator.Emit(<see cref="OpCodes.Ldind_I"/>) that
|
|
2126 /// loads a value of type natural int as a natural int onto the evaluation stack indirectly.
|
|
2127 /// </summary>
|
|
2128 /// <seealso cref="OpCodes.Ldind_I">OpCodes.Ldind_I</seealso>
|
|
2129 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
2130 public EmitHelper ldind_i
|
|
2131 {
|
|
2132 get { _ilGenerator.Emit(OpCodes.Ldind_I); return this; }
|
|
2133 }
|
|
2134
|
|
2135 /// <summary>
|
|
2136 /// Calls ILGenerator.Emit(<see cref="OpCodes.Ldind_I1"/>) that
|
|
2137 /// loads a value of type int8 as an int32 onto the evaluation stack indirectly.
|
|
2138 /// </summary>
|
|
2139 /// <seealso cref="OpCodes.Ldind_I1">OpCodes.Ldind_I1</seealso>
|
|
2140 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
2141 public EmitHelper ldind_i1
|
|
2142 {
|
|
2143 get { _ilGenerator.Emit(OpCodes.Ldind_I1); return this; }
|
|
2144 }
|
|
2145
|
|
2146 /// <summary>
|
|
2147 /// Calls ILGenerator.Emit(<see cref="OpCodes.Ldind_I2"/>) that
|
|
2148 /// loads a value of type int16 as an int32 onto the evaluation stack indirectly.
|
|
2149 /// </summary>
|
|
2150 /// <seealso cref="OpCodes.Ldind_I2">OpCodes.Ldind_I2</seealso>
|
|
2151 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
2152 public EmitHelper ldind_i2
|
|
2153 {
|
|
2154 get { _ilGenerator.Emit(OpCodes.Ldind_I2); return this; }
|
|
2155 }
|
|
2156
|
|
2157 /// <summary>
|
|
2158 /// Calls ILGenerator.Emit(<see cref="OpCodes.Ldind_I4"/>) that
|
|
2159 /// loads a value of type int32 as an int32 onto the evaluation stack indirectly.
|
|
2160 /// </summary>
|
|
2161 /// <seealso cref="OpCodes.Ldind_I4">OpCodes.Ldind_I4</seealso>
|
|
2162 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
2163 public EmitHelper ldind_i4
|
|
2164 {
|
|
2165 get { _ilGenerator.Emit(OpCodes.Ldind_I4); return this; }
|
|
2166 }
|
|
2167
|
|
2168 /// <summary>
|
|
2169 /// Calls ILGenerator.Emit(<see cref="OpCodes.Ldind_I8"/>) that
|
|
2170 /// loads a value of type int64 as an int64 onto the evaluation stack indirectly.
|
|
2171 /// </summary>
|
|
2172 /// <seealso cref="OpCodes.Ldind_I8">OpCodes.Ldind_I8</seealso>
|
|
2173 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
2174 public EmitHelper ldind_i8
|
|
2175 {
|
|
2176 get { _ilGenerator.Emit(OpCodes.Ldind_I8); return this; }
|
|
2177 }
|
|
2178
|
|
2179 /// <summary>
|
|
2180 /// Calls ILGenerator.Emit(<see cref="OpCodes.Ldind_R4"/>) that
|
|
2181 /// loads a value of type float32 as a type F (float) onto the evaluation stack indirectly.
|
|
2182 /// </summary>
|
|
2183 /// <seealso cref="OpCodes.Ldind_R4">OpCodes.Ldind_R4</seealso>
|
|
2184 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
2185 public EmitHelper ldind_r4
|
|
2186 {
|
|
2187 get { _ilGenerator.Emit(OpCodes.Ldind_R4); return this; }
|
|
2188 }
|
|
2189
|
|
2190 /// <summary>
|
|
2191 /// Calls ILGenerator.Emit(<see cref="OpCodes.Ldind_R8"/>) that
|
|
2192 /// loads a value of type float64 as a type F (float) onto the evaluation stack indirectly.
|
|
2193 /// </summary>
|
|
2194 /// <seealso cref="OpCodes.Ldind_R8">OpCodes.Ldind_R8</seealso>
|
|
2195 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
2196 public EmitHelper ldind_r8
|
|
2197 {
|
|
2198 get { _ilGenerator.Emit(OpCodes.Ldind_R8); return this; }
|
|
2199 }
|
|
2200
|
|
2201 /// <summary>
|
|
2202 /// Calls ILGenerator.Emit(<see cref="OpCodes.Ldind_Ref"/>) that
|
|
2203 /// loads an object reference as a type O (object reference) onto the evaluation stack indirectly.
|
|
2204 /// </summary>
|
|
2205 /// <seealso cref="OpCodes.Ldind_Ref">OpCodes.Ldind_Ref</seealso>
|
|
2206 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
2207 public EmitHelper ldind_ref
|
|
2208 {
|
|
2209 get { _ilGenerator.Emit(OpCodes.Ldind_Ref); return this; }
|
|
2210 }
|
|
2211
|
|
2212 /// <summary>
|
|
2213 /// Calls ILGenerator.Emit(<see cref="OpCodes.Ldind_U1"/>) that
|
|
2214 /// loads a value of type unsigned int8 as an int32 onto the evaluation stack indirectly.
|
|
2215 /// </summary>
|
|
2216 /// <seealso cref="OpCodes.Ldind_U1">OpCodes.Ldind_U1</seealso>
|
|
2217 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
2218 public EmitHelper ldind_u1
|
|
2219 {
|
|
2220 get { _ilGenerator.Emit(OpCodes.Ldind_U1); return this; }
|
|
2221 }
|
|
2222
|
|
2223 /// <summary>
|
|
2224 /// Calls ILGenerator.Emit(<see cref="OpCodes.Ldind_U2"/>) that
|
|
2225 /// loads a value of type unsigned int16 as an int32 onto the evaluation stack indirectly.
|
|
2226 /// </summary>
|
|
2227 /// <seealso cref="OpCodes.Ldind_U2">OpCodes.Ldind_U2</seealso>
|
|
2228 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
2229 public EmitHelper ldind_u2
|
|
2230 {
|
|
2231 get { _ilGenerator.Emit(OpCodes.Ldind_U2); return this; }
|
|
2232 }
|
|
2233
|
|
2234 /// <summary>
|
|
2235 /// Calls ILGenerator.Emit(<see cref="OpCodes.Ldind_U4"/>) that
|
|
2236 /// loads a value of type unsigned int32 as an int32 onto the evaluation stack indirectly.
|
|
2237 /// </summary>
|
|
2238 /// <seealso cref="OpCodes.Ldind_U4">OpCodes.Ldind_U4</seealso>
|
|
2239 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
2240 public EmitHelper ldind_u4
|
|
2241 {
|
|
2242 get { _ilGenerator.Emit(OpCodes.Ldind_U4); return this; }
|
|
2243 }
|
|
2244
|
|
2245 /// <summary>
|
|
2246 /// Loads a value of the type from a supplied address.
|
|
2247 /// </summary>
|
|
2248 /// <param name="type">A Type.</param>
|
|
2249 public EmitHelper ldind(Type type)
|
|
2250 {
|
|
2251 if (type == null) throw new ArgumentNullException("type");
|
|
2252
|
|
2253 switch (Type.GetTypeCode(type))
|
|
2254 {
|
|
2255 case TypeCode.Boolean:
|
|
2256 case TypeCode.Byte:
|
|
2257 case TypeCode.SByte: ldind_i1.end(); break;
|
|
2258
|
|
2259 case TypeCode.Char:
|
|
2260 case TypeCode.Int16:
|
|
2261 case TypeCode.UInt16: ldind_i2.end(); break;
|
|
2262
|
|
2263 case TypeCode.Int32:
|
|
2264 case TypeCode.UInt32: ldind_i4.end(); break;
|
|
2265
|
|
2266 case TypeCode.Int64:
|
|
2267 case TypeCode.UInt64: ldind_i8.end(); break;
|
|
2268
|
|
2269 case TypeCode.Single: ldind_r4.end(); break;
|
|
2270 case TypeCode.Double: ldind_r8.end(); break;
|
|
2271
|
|
2272 default:
|
|
2273 if (type.IsClass)
|
|
2274 ldind_ref.end();
|
|
2275 else if (type.IsValueType)
|
|
2276 stobj(type);
|
|
2277 else
|
|
2278 throw CreateNotExpectedTypeException(type);
|
|
2279 break;
|
|
2280 }
|
|
2281
|
|
2282 return this;
|
|
2283 }
|
|
2284
|
|
2285 /// <summary>
|
|
2286 /// Calls ILGenerator.Emit(<see cref="OpCodes.Ldlen"/>) that
|
|
2287 /// pushes the number of elements of a zero-based, one-dimensional array onto the evaluation stack.
|
|
2288 /// </summary>
|
|
2289 /// <seealso cref="OpCodes.Ldlen">OpCodes.Ldlen</seealso>
|
|
2290 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
2291 public EmitHelper ldlen
|
|
2292 {
|
|
2293 get { _ilGenerator.Emit(OpCodes.Ldlen); return this; }
|
|
2294 }
|
|
2295
|
|
2296 /// <summary>
|
|
2297 /// Calls ILGenerator.Emit(<see cref="OpCodes.Ldloc"/>, short) that
|
|
2298 /// load an argument address onto the evaluation stack.
|
|
2299 /// </summary>
|
|
2300 /// <param name="index">Index of the local variable value pushed onto the stack.</param>
|
|
2301 /// <seealso cref="OpCodes.Ldloc">OpCodes.Ldloc</seealso>
|
|
2302 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,short)">ILGenerator.Emit</seealso>
|
|
2303 public EmitHelper ldloc(short index)
|
|
2304 {
|
|
2305 _ilGenerator.Emit(OpCodes.Ldloc, index); return this;
|
|
2306 }
|
|
2307
|
|
2308 /// <summary>
|
|
2309 /// Calls ILGenerator.Emit(<see cref="OpCodes.Ldloc"/>, <see cref="LocalBuilder"/>) that
|
|
2310 /// load an argument address onto the evaluation stack.
|
|
2311 /// </summary>
|
|
2312 /// <param name="localBuilder">Local variable builder.</param>
|
|
2313 /// <seealso cref="OpCodes.Ldloc">OpCodes.Ldloc</seealso>
|
|
2314 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,short)">ILGenerator.Emit</seealso>
|
|
2315 public EmitHelper ldloc(LocalBuilder localBuilder)
|
|
2316 {
|
|
2317 _ilGenerator.Emit(OpCodes.Ldloc, localBuilder); return this;
|
|
2318 }
|
|
2319
|
|
2320 /// <summary>
|
|
2321 /// Calls ILGenerator.Emit(<see cref="OpCodes.Ldloca"/>, short) that
|
|
2322 /// loads the address of the local variable at a specific index onto the evaluation stack.
|
|
2323 /// </summary>
|
|
2324 /// <param name="index">Index of the local variable.</param>
|
|
2325 /// <seealso cref="OpCodes.Ldloca">OpCodes.Ldloca</seealso>
|
|
2326 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,short)">ILGenerator.Emit</seealso>
|
|
2327 public EmitHelper ldloca(short index)
|
|
2328 {
|
|
2329 _ilGenerator.Emit(OpCodes.Ldloca, index); return this;
|
|
2330 }
|
|
2331
|
|
2332 /// <summary>
|
|
2333 /// Calls ILGenerator.Emit(<see cref="OpCodes.Ldloca_S"/>, byte) that
|
|
2334 /// loads the address of the local variable at a specific index onto the evaluation stack, short form.
|
|
2335 /// </summary>
|
|
2336 /// <param name="index">Index of the local variable.</param>
|
|
2337 /// <seealso cref="OpCodes.Ldloca_S">OpCodes.Ldloca_S</seealso>
|
|
2338 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,byte)">ILGenerator.Emit</seealso>
|
|
2339 public EmitHelper ldloca_s(byte index)
|
|
2340 {
|
|
2341 _ilGenerator.Emit(OpCodes.Ldloca_S, index); return this;
|
|
2342 }
|
|
2343
|
|
2344 /// <summary>
|
|
2345 /// Calls ILGenerator.Emit(<see cref="OpCodes.Ldloca"/>, <see cref="LocalBuilder"/>) that
|
|
2346 /// loads the address of the local variable at a specific index onto the evaluation stack.
|
|
2347 /// </summary>
|
|
2348 /// <param name="local">A <see cref="LocalBuilder"/> representing the local variable.</param>
|
|
2349 /// <seealso cref="OpCodes.Ldloca">OpCodes.Ldloca</seealso>
|
|
2350 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,short)">ILGenerator.Emit</seealso>
|
|
2351 public EmitHelper ldloca(LocalBuilder local)
|
|
2352 {
|
|
2353 _ilGenerator.Emit(OpCodes.Ldloca, local); return this;
|
|
2354 }
|
|
2355
|
|
2356 /// <summary>
|
|
2357 /// Calls ILGenerator.Emit(<see cref="OpCodes.Ldloc_0"/>) that
|
|
2358 /// loads the local variable at index 0 onto the evaluation stack.
|
|
2359 /// </summary>
|
|
2360 /// <seealso cref="OpCodes.Ldloc_0">OpCodes.Ldloc_0</seealso>
|
|
2361 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
2362 public EmitHelper ldloc_0
|
|
2363 {
|
|
2364 get { _ilGenerator.Emit(OpCodes.Ldloc_0); return this; }
|
|
2365 }
|
|
2366
|
|
2367 /// <summary>
|
|
2368 /// Calls ILGenerator.Emit(<see cref="OpCodes.Ldloc_1"/>) that
|
|
2369 /// loads the local variable at index 1 onto the evaluation stack.
|
|
2370 /// </summary>
|
|
2371 /// <seealso cref="OpCodes.Ldloc_1">OpCodes.Ldloc_1</seealso>
|
|
2372 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
2373 public EmitHelper ldloc_1
|
|
2374 {
|
|
2375 get { _ilGenerator.Emit(OpCodes.Ldloc_1); return this; }
|
|
2376 }
|
|
2377
|
|
2378 /// <summary>
|
|
2379 /// Calls ILGenerator.Emit(<see cref="OpCodes.Ldloc_2"/>) that
|
|
2380 /// loads the local variable at index 2 onto the evaluation stack.
|
|
2381 /// </summary>
|
|
2382 /// <seealso cref="OpCodes.Ldloc_2">OpCodes.Ldloc_2</seealso>
|
|
2383 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
2384 public EmitHelper ldloc_2
|
|
2385 {
|
|
2386 get { _ilGenerator.Emit(OpCodes.Ldloc_2); return this; }
|
|
2387 }
|
|
2388
|
|
2389 /// <summary>
|
|
2390 /// Calls ILGenerator.Emit(<see cref="OpCodes.Ldloc_3"/>) that
|
|
2391 /// loads the local variable at index 3 onto the evaluation stack.
|
|
2392 /// </summary>
|
|
2393 /// <seealso cref="OpCodes.Ldloc_3">OpCodes.Ldloc_3</seealso>
|
|
2394 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
2395 public EmitHelper ldloc_3
|
|
2396 {
|
|
2397 get { _ilGenerator.Emit(OpCodes.Ldloc_3); return this; }
|
|
2398 }
|
|
2399
|
|
2400 /// <summary>
|
|
2401 /// Calls ILGenerator.Emit(<see cref="OpCodes.Ldloc_S"/>, byte) that
|
|
2402 /// loads the local variable at a specific index onto the evaluation stack, short form.
|
|
2403 /// </summary>
|
|
2404 /// <param name="index">Index of the local variable.</param>
|
|
2405 /// <seealso cref="OpCodes.Ldloc_S">OpCodes.Ldloc_S</seealso>
|
|
2406 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,byte)">ILGenerator.Emit</seealso>
|
|
2407 public EmitHelper ldloc_s(byte index)
|
|
2408 {
|
|
2409 _ilGenerator.Emit(OpCodes.Ldloca_S, index); return this;
|
|
2410 }
|
|
2411
|
|
2412 /// <summary>
|
|
2413 /// Calls ILGenerator.Emit(<see cref="OpCodes.Ldnull"/>) that
|
|
2414 /// pushes a null reference (type O) onto the evaluation stack.
|
|
2415 /// </summary>
|
|
2416 /// <seealso cref="OpCodes.Ldnull">OpCodes.Ldnull</seealso>
|
|
2417 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
2418 public EmitHelper ldnull
|
|
2419 {
|
|
2420 get { _ilGenerator.Emit(OpCodes.Ldnull); return this; }
|
|
2421 }
|
|
2422
|
|
2423 /// <summary>
|
|
2424 /// Calls ILGenerator.Emit(<see cref="OpCodes.Ldobj"/>, type) that
|
|
2425 /// copies the value type object pointed to by an address to the top of the evaluation stack.
|
|
2426 /// </summary>
|
|
2427 /// <param name="type">A Type</param>
|
|
2428 /// <seealso cref="OpCodes.Ldobj">OpCodes.Ldobj</seealso>
|
|
2429 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,Type)">ILGenerator.Emit</seealso>
|
|
2430 public EmitHelper ldobj(Type type)
|
|
2431 {
|
|
2432 _ilGenerator.Emit(OpCodes.Ldobj, type); return this;
|
|
2433 }
|
|
2434
|
|
2435 /// <summary>
|
|
2436 /// Calls ILGenerator.Emit(<see cref="OpCodes.Ldsfld"/>, fieldInfo) that
|
|
2437 /// pushes the value of a static field onto the evaluation stack.
|
|
2438 /// </summary>
|
|
2439 /// <param name="fieldInfo">A <see cref="FieldInfo"/> representing a field.</param>
|
|
2440 /// <seealso cref="OpCodes.Ldsfld">OpCodes.Ldsfld</seealso>
|
|
2441 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,FieldInfo)">ILGenerator.Emit</seealso>
|
|
2442 public EmitHelper ldsfld(FieldInfo fieldInfo)
|
|
2443 {
|
|
2444 _ilGenerator.Emit(OpCodes.Ldsfld, fieldInfo); return this;
|
|
2445 }
|
|
2446
|
|
2447 /// <summary>
|
|
2448 /// Calls ILGenerator.Emit(<see cref="OpCodes.Ldsflda"/>, fieldInfo) that
|
|
2449 /// pushes the address of a static field onto the evaluation stack.
|
|
2450 /// </summary>
|
|
2451 /// <param name="fieldInfo">A <see cref="FieldInfo"/> representing a field.</param>
|
|
2452 /// <seealso cref="OpCodes.Ldsflda">OpCodes.Ldsflda</seealso>
|
|
2453 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,FieldInfo)">ILGenerator.Emit</seealso>
|
|
2454 public EmitHelper ldsflda(FieldInfo fieldInfo)
|
|
2455 {
|
|
2456 _ilGenerator.Emit(OpCodes.Ldsflda, fieldInfo); return this;
|
|
2457 }
|
|
2458
|
|
2459 /// <summary>
|
|
2460 /// Calls <see cref="ldstr"/> -or- <see cref="ldnull"/>,
|
|
2461 /// if given string is a null reference.
|
|
2462 /// </summary>
|
|
2463 /// <param name="str">The String to be emitted.</param>
|
|
2464 /// <seealso cref="ldstr"/>
|
|
2465 /// <seealso cref="ldnull"/>
|
|
2466 public EmitHelper ldstrEx(string str)
|
|
2467 {
|
|
2468 return str == null ? ldnull : ldstr(str);
|
|
2469 }
|
|
2470
|
|
2471 /// <summary>
|
|
2472 /// Calls ILGenerator.Emit(<see cref="OpCodes.Ldstr"/>, string) that
|
|
2473 /// pushes a new object reference to a string literal stored in the metadata.
|
|
2474 /// </summary>
|
|
2475 /// <param name="str">The String to be emitted.</param>
|
|
2476 /// <seealso cref="OpCodes.Ldstr">OpCodes.Ldstr</seealso>
|
|
2477 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,FieldInfo)">ILGenerator.Emit</seealso>
|
|
2478 public EmitHelper ldstr(string str)
|
|
2479 {
|
|
2480 _ilGenerator.Emit(OpCodes.Ldstr, str); return this;
|
|
2481 }
|
|
2482
|
|
2483 /// <summary>
|
|
2484 /// Calls ILGenerator.Emit(<see cref="OpCodes.Ldstr"/>, string) that
|
|
2485 /// pushes a new object reference to a string literal stored in the metadata.
|
|
2486 /// </summary>
|
|
2487 /// <param name="nameOrIndex">The <see cref="NameOrIndexParameter"/> to be emitted.</param>
|
|
2488 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,FieldInfo)">ILGenerator.Emit</seealso>
|
|
2489 public EmitHelper ldNameOrIndex(NameOrIndexParameter nameOrIndex)
|
|
2490 {
|
|
2491 return nameOrIndex.ByName?
|
|
2492 ldstr (nameOrIndex.Name) .call(typeof(NameOrIndexParameter), "op_Implicit", typeof(string)):
|
|
2493 ldc_i4_(nameOrIndex.Index).call(typeof(NameOrIndexParameter), "op_Implicit", typeof(int));
|
|
2494 }
|
|
2495
|
|
2496 /// <summary>
|
|
2497 /// Calls ILGenerator.Emit(<see cref="OpCodes.Ldtoken"/>, methodInfo) that
|
|
2498 /// converts a metadata token to its runtime representation, pushing it onto the evaluation stack.
|
|
2499 /// </summary>
|
|
2500 /// <param name="methodInfo">The method to be called.</param>
|
|
2501 /// <seealso cref="OpCodes.Ldtoken">OpCodes.Ldtoken</seealso>
|
|
2502 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,MethodInfo)">ILGenerator.Emit</seealso>
|
|
2503 public EmitHelper ldtoken(MethodInfo methodInfo)
|
|
2504 {
|
|
2505 _ilGenerator.Emit(OpCodes.Ldtoken, methodInfo); return this;
|
|
2506 }
|
|
2507
|
|
2508 /// <summary>
|
|
2509 /// Calls ILGenerator.Emit(<see cref="OpCodes.Ldtoken"/>, fieldInfo) that
|
|
2510 /// converts a metadata token to its runtime representation,
|
|
2511 /// pushing it onto the evaluation stack.
|
|
2512 /// </summary>
|
|
2513 /// <param name="fieldInfo">A <see cref="FieldInfo"/> representing a field.</param>
|
|
2514 /// <seealso cref="OpCodes.Ldtoken">OpCodes.Ldtoken</seealso>
|
|
2515 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,FieldInfo)">ILGenerator.Emit</seealso>
|
|
2516 public EmitHelper ldtoken(FieldInfo fieldInfo)
|
|
2517 {
|
|
2518 _ilGenerator.Emit(OpCodes.Ldtoken, fieldInfo); return this;
|
|
2519 }
|
|
2520
|
|
2521 /// <summary>
|
|
2522 /// Calls ILGenerator.Emit(<see cref="OpCodes.Ldtoken"/>, type) that
|
|
2523 /// converts a metadata token to its runtime representation, pushing it onto the evaluation stack.
|
|
2524 /// </summary>
|
|
2525 /// <param name="type">A Type</param>
|
|
2526 /// <seealso cref="OpCodes.Ldtoken">OpCodes.Ldtoken</seealso>
|
|
2527 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,Type)">ILGenerator.Emit</seealso>
|
|
2528 public EmitHelper ldtoken(Type type)
|
|
2529 {
|
|
2530 _ilGenerator.Emit(OpCodes.Ldtoken, type); return this;
|
|
2531 }
|
|
2532
|
|
2533 /// <summary>
|
|
2534 /// Calls ILGenerator.Emit(<see cref="OpCodes.Ldvirtftn"/>, methodInfo) that
|
|
2535 /// pushes an unmanaged pointer (type natural int) to the native code implementing a particular virtual method
|
|
2536 /// associated with a specified object onto the evaluation stack.
|
|
2537 /// </summary>
|
|
2538 /// <param name="methodInfo">The method to be called.</param>
|
|
2539 /// <seealso cref="OpCodes.Ldvirtftn">OpCodes.Ldvirtftn</seealso>
|
|
2540 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,MethodInfo)">ILGenerator.Emit</seealso>
|
|
2541 public EmitHelper ldvirtftn(MethodInfo methodInfo)
|
|
2542 {
|
|
2543 _ilGenerator.Emit(OpCodes.Ldvirtftn, methodInfo); return this;
|
|
2544 }
|
|
2545
|
|
2546 /// <summary>
|
|
2547 /// Calls ILGenerator.Emit(<see cref="OpCodes.Leave"/>, label) that
|
|
2548 /// exits a protected region of code, unconditionally tranferring control to a specific target instruction.
|
|
2549 /// </summary>
|
|
2550 /// <param name="label">The label.</param>
|
|
2551 /// <seealso cref="OpCodes.Leave">OpCodes.Leave</seealso>
|
|
2552 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,Label)">ILGenerator.Emit</seealso>
|
|
2553 public EmitHelper leave(Label label)
|
|
2554 {
|
|
2555 _ilGenerator.Emit(OpCodes.Leave, label); return this;
|
|
2556 }
|
|
2557
|
|
2558 /// <summary>
|
|
2559 /// Calls ILGenerator.Emit(<see cref="OpCodes.Leave_S"/>, label) that
|
|
2560 /// exits a protected region of code, unconditionally transferring control to a target instruction (short form).
|
|
2561 /// </summary>
|
|
2562 /// <param name="label">The label.</param>
|
|
2563 /// <seealso cref="OpCodes.Leave_S">OpCodes.Leave_S</seealso>
|
|
2564 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,Label)">ILGenerator.Emit</seealso>
|
|
2565 public EmitHelper leave_s(Label label)
|
|
2566 {
|
|
2567 _ilGenerator.Emit(OpCodes.Leave_S, label); return this;
|
|
2568 }
|
|
2569
|
|
2570 /// <summary>
|
|
2571 /// Calls ILGenerator.Emit(<see cref="OpCodes.Localloc"/>) that
|
|
2572 /// allocates a certain number of bytes from the local dynamic memory pool and pushes the address
|
|
2573 /// (a transient pointer, type *) of the first allocated byte onto the evaluation stack.
|
|
2574 /// </summary>
|
|
2575 /// <seealso cref="OpCodes.Localloc">OpCodes.Localloc</seealso>
|
|
2576 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
2577 public EmitHelper localloc
|
|
2578 {
|
|
2579 get { _ilGenerator.Emit(OpCodes.Localloc); return this; }
|
|
2580 }
|
|
2581
|
|
2582 /// <summary>
|
|
2583 /// Calls ILGenerator.Emit(<see cref="OpCodes.Mkrefany"/>, type) that
|
|
2584 /// pushes a typed reference to an instance of a specific type onto the evaluation stack.
|
|
2585 /// </summary>
|
|
2586 /// <param name="type">A Type</param>
|
|
2587 /// <seealso cref="OpCodes.Mkrefany">OpCodes.Mkrefany</seealso>
|
|
2588 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,Type)">ILGenerator.Emit</seealso>
|
|
2589 public EmitHelper mkrefany(Type type)
|
|
2590 {
|
|
2591 _ilGenerator.Emit(OpCodes.Mkrefany, type); return this;
|
|
2592 }
|
|
2593
|
|
2594 /// <summary>
|
|
2595 /// Calls ILGenerator.Emit(<see cref="OpCodes.Mul"/>) that
|
|
2596 /// multiplies two values and pushes the result on the evaluation stack.
|
|
2597 /// (a transient pointer, type *) of the first allocated byte onto the evaluation stack.
|
|
2598 /// </summary>
|
|
2599 /// <seealso cref="OpCodes.Mul">OpCodes.Mul</seealso>
|
|
2600 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
2601 public EmitHelper mul
|
|
2602 {
|
|
2603 get { _ilGenerator.Emit(OpCodes.Mul); return this; }
|
|
2604 }
|
|
2605
|
|
2606 /// <summary>
|
|
2607 /// Calls ILGenerator.Emit(<see cref="OpCodes.Mul_Ovf"/>) that
|
|
2608 /// multiplies two integer values, performs an overflow check,
|
|
2609 /// and pushes the result onto the evaluation stack.
|
|
2610 /// </summary>
|
|
2611 /// <seealso cref="OpCodes.Mul_Ovf">OpCodes.Mul_Ovf</seealso>
|
|
2612 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
2613 public EmitHelper mul_ovf
|
|
2614 {
|
|
2615 get { _ilGenerator.Emit(OpCodes.Mul_Ovf); return this; }
|
|
2616 }
|
|
2617
|
|
2618 /// <summary>
|
|
2619 /// Calls ILGenerator.Emit(<see cref="OpCodes.Mul_Ovf_Un"/>) that
|
|
2620 /// multiplies two unsigned integer values, performs an overflow check,
|
|
2621 /// and pushes the result onto the evaluation stack.
|
|
2622 /// </summary>
|
|
2623 /// <seealso cref="OpCodes.Mul_Ovf_Un">OpCodes.Mul_Ovf_Un</seealso>
|
|
2624 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
2625 public EmitHelper mul_ovf_un
|
|
2626 {
|
|
2627 get { _ilGenerator.Emit(OpCodes.Mul_Ovf_Un); return this; }
|
|
2628 }
|
|
2629
|
|
2630 /// <summary>
|
|
2631 /// Calls ILGenerator.Emit(<see cref="OpCodes.Neg"/>) that
|
|
2632 /// negates a value and pushes the result onto the evaluation stack.
|
|
2633 /// </summary>
|
|
2634 /// <seealso cref="OpCodes.Neg">OpCodes.Neg</seealso>
|
|
2635 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
2636 public EmitHelper neg
|
|
2637 {
|
|
2638 get { _ilGenerator.Emit(OpCodes.Neg); return this; }
|
|
2639 }
|
|
2640
|
|
2641 /// <summary>
|
|
2642 /// Calls ILGenerator.Emit(<see cref="OpCodes.Newarr"/>, type) that
|
|
2643 /// pushes an object reference to a new zero-based, one-dimensional array whose elements
|
|
2644 /// are of a specific type onto the evaluation stack.
|
|
2645 /// </summary>
|
|
2646 /// <param name="type">A Type</param>
|
|
2647 /// <seealso cref="OpCodes.Newarr">OpCodes.Newarr</seealso>
|
|
2648 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,Type)">ILGenerator.Emit</seealso>
|
|
2649 public EmitHelper newarr(Type type)
|
|
2650 {
|
|
2651 _ilGenerator.Emit(OpCodes.Newarr, type); return this;
|
|
2652 }
|
|
2653
|
|
2654 /// <summary>
|
|
2655 /// Calls ILGenerator.Emit(<see cref="OpCodes.Newobj"/>, <see cref="ConstructorInfo"/>) that
|
|
2656 /// creates a new object or a new instance of a value type,
|
|
2657 /// pushing an object reference (type O) onto the evaluation stack.
|
|
2658 /// </summary>
|
|
2659 /// <param name="constructorInfo">A <see cref="ConstructorInfo"/> representing a constructor.</param>
|
|
2660 /// <seealso cref="OpCodes.Newobj">OpCodes.Newobj</seealso>
|
|
2661 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,ConstructorInfo)">ILGenerator.Emit</seealso>
|
|
2662 public EmitHelper newobj(ConstructorInfo constructorInfo)
|
|
2663 {
|
|
2664 _ilGenerator.Emit(OpCodes.Newobj, constructorInfo); return this;
|
|
2665 }
|
|
2666
|
|
2667 /// <summary>
|
|
2668 /// Calls ILGenerator.Emit(<see cref="OpCodes.Newobj"/>, ConstructorInfo) that
|
|
2669 /// creates a new object or a new instance of a value type,
|
|
2670 /// pushing an object reference (type O) onto the evaluation stack.
|
|
2671 /// </summary>
|
|
2672 /// <param name="type">A type.</param>
|
|
2673 /// <param name="parameters">An array of System.Type objects representing
|
|
2674 /// the number, order, and type of the parameters for the desired constructor.
|
|
2675 /// -or- An empty array of System.Type objects, to get a constructor that takes
|
|
2676 /// no parameters. Such an empty array is provided by the static field System.Type.EmptyTypes.</param>
|
|
2677 public EmitHelper newobj(Type type, params Type[] parameters)
|
|
2678 {
|
|
2679 if (type == null) throw new ArgumentNullException("type");
|
|
2680
|
|
2681 ConstructorInfo ci = type.GetConstructor(parameters);
|
|
2682
|
|
2683 return newobj(ci);
|
|
2684 }
|
|
2685
|
|
2686 /// <summary>
|
|
2687 /// Calls ILGenerator.Emit(<see cref="OpCodes.Nop"/>) that
|
|
2688 /// fills space if opcodes are patched. No meaningful operation is performed although
|
|
2689 /// a processing cycle can be consumed.
|
|
2690 /// </summary>
|
|
2691 /// <seealso cref="OpCodes.Nop">OpCodes.Nop</seealso>
|
|
2692 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
2693 public EmitHelper nop
|
|
2694 {
|
|
2695 get { _ilGenerator.Emit(OpCodes.Nop); return this; }
|
|
2696 }
|
|
2697
|
|
2698 /// <summary>
|
|
2699 /// Calls ILGenerator.Emit(<see cref="OpCodes.Not"/>) that
|
|
2700 /// computes the bitwise complement of the integer value on top of the stack
|
|
2701 /// and pushes the result onto the evaluation stack as the same type.
|
|
2702 /// </summary>
|
|
2703 /// <seealso cref="OpCodes.Not">OpCodes.Not</seealso>
|
|
2704 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
2705 public EmitHelper not
|
|
2706 {
|
|
2707 get { _ilGenerator.Emit(OpCodes.Not); return this; }
|
|
2708 }
|
|
2709
|
|
2710 /// <summary>
|
|
2711 /// Calls ILGenerator.Emit(<see cref="OpCodes.Or"/>) that
|
|
2712 /// compute the bitwise complement of the two integer values on top of the stack and
|
|
2713 /// pushes the result onto the evaluation stack.
|
|
2714 /// </summary>
|
|
2715 /// <seealso cref="OpCodes.Or">OpCodes.Or</seealso>
|
|
2716 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
2717 public EmitHelper or
|
|
2718 {
|
|
2719 get { _ilGenerator.Emit(OpCodes.Or); return this; }
|
|
2720 }
|
|
2721
|
|
2722 /// <summary>
|
|
2723 /// Calls ILGenerator.Emit(<see cref="OpCodes.Pop"/>) that
|
|
2724 /// removes the value currently on top of the evaluation stack.
|
|
2725 /// </summary>
|
|
2726 /// <seealso cref="OpCodes.Pop">OpCodes.Pop</seealso>
|
|
2727 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
2728 public EmitHelper pop
|
|
2729 {
|
|
2730 get { _ilGenerator.Emit(OpCodes.Pop); return this; }
|
|
2731 }
|
|
2732
|
|
2733 /// <summary>
|
|
2734 /// Calls ILGenerator.Emit(<see cref="OpCodes.Refanytype"/>) that
|
|
2735 /// specifies that the subsequent array address operation performs
|
|
2736 /// no type check at run time, and that it returns a managed pointer
|
|
2737 /// whose mutability is restricted.
|
|
2738 /// </summary>
|
|
2739 /// <seealso cref="OpCodes.Refanytype">OpCodes.Refanytype</seealso>
|
|
2740 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
2741 public EmitHelper @readonly
|
|
2742 {
|
|
2743 get { _ilGenerator.Emit(OpCodes.Readonly); return this; }
|
|
2744 }
|
|
2745
|
|
2746 /// <summary>
|
|
2747 /// Calls ILGenerator.Emit(<see cref="OpCodes.Refanytype"/>) that
|
|
2748 /// retrieves the type token embedded in a typed reference.
|
|
2749 /// </summary>
|
|
2750 /// <seealso cref="OpCodes.Refanytype">OpCodes.Refanytype</seealso>
|
|
2751 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
2752 public EmitHelper refanytype
|
|
2753 {
|
|
2754 get { _ilGenerator.Emit(OpCodes.Refanytype); return this; }
|
|
2755 }
|
|
2756
|
|
2757 /// <summary>
|
|
2758 /// Calls ILGenerator.Emit(<see cref="OpCodes.Refanyval"/>, type) that
|
|
2759 /// retrieves the address (type &) embedded in a typed reference.
|
|
2760 /// </summary>
|
|
2761 /// <param name="type">A Type</param>
|
|
2762 /// <seealso cref="OpCodes.Refanyval">OpCodes.Refanyval</seealso>
|
|
2763 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,Type)">ILGenerator.Emit</seealso>
|
|
2764 public EmitHelper refanyval(Type type)
|
|
2765 {
|
|
2766 _ilGenerator.Emit(OpCodes.Refanyval, type); return this;
|
|
2767 }
|
|
2768
|
|
2769 /// <summary>
|
|
2770 /// Calls ILGenerator.Emit(<see cref="OpCodes.Rem"/>) that
|
|
2771 /// divides two values and pushes the remainder onto the evaluation stack.
|
|
2772 /// </summary>
|
|
2773 /// <seealso cref="OpCodes.Rem">OpCodes.Rem</seealso>
|
|
2774 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
2775 public EmitHelper rem
|
|
2776 {
|
|
2777 get { _ilGenerator.Emit(OpCodes.Rem); return this; }
|
|
2778 }
|
|
2779
|
|
2780 /// <summary>
|
|
2781 /// Calls ILGenerator.Emit(<see cref="OpCodes.Rem_Un"/>) that
|
|
2782 /// divides two unsigned values and pushes the remainder onto the evaluation stack.
|
|
2783 /// </summary>
|
|
2784 /// <seealso cref="OpCodes.Rem_Un">OpCodes.Rem_Un</seealso>
|
|
2785 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
2786 public EmitHelper rem_un
|
|
2787 {
|
|
2788 get { _ilGenerator.Emit(OpCodes.Rem_Un); return this; }
|
|
2789 }
|
|
2790
|
|
2791 /// <summary>
|
|
2792 /// Calls ILGenerator.Emit(<see cref="OpCodes.Ret"/>) that
|
|
2793 /// returns from the current method, pushing a return value (if present)
|
|
2794 /// from the caller's evaluation stack onto the callee's evaluation stack.
|
|
2795 /// </summary>
|
|
2796 /// <seealso cref="OpCodes.Ret">OpCodes.Ret</seealso>
|
|
2797 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
2798 public EmitHelper ret()
|
|
2799 {
|
|
2800 _ilGenerator.Emit(OpCodes.Ret); return this;
|
|
2801 }
|
|
2802
|
|
2803 /// <summary>
|
|
2804 /// Calls ILGenerator.Emit(<see cref="OpCodes.Rethrow"/>) that
|
|
2805 /// rethrows the current exception.
|
|
2806 /// </summary>
|
|
2807 /// <seealso cref="OpCodes.Rethrow">OpCodes.Rethrow</seealso>
|
|
2808 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
2809 public EmitHelper rethrow
|
|
2810 {
|
|
2811 get { _ilGenerator.Emit(OpCodes.Rethrow); return this; }
|
|
2812 }
|
|
2813
|
|
2814 /// <summary>
|
|
2815 /// Calls ILGenerator.Emit(<see cref="OpCodes.Shl"/>) that
|
|
2816 /// shifts an integer value to the left (in zeroes) by a specified number of bits,
|
|
2817 /// pushing the result onto the evaluation stack.
|
|
2818 /// </summary>
|
|
2819 /// <seealso cref="OpCodes.Shl">OpCodes.Shl</seealso>
|
|
2820 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
2821 public EmitHelper shl
|
|
2822 {
|
|
2823 get { _ilGenerator.Emit(OpCodes.Shl); return this; }
|
|
2824 }
|
|
2825
|
|
2826 /// <summary>
|
|
2827 /// Calls ILGenerator.Emit(<see cref="OpCodes.Shr"/>) that
|
|
2828 /// shifts an integer value (in sign) to the right by a specified number of bits,
|
|
2829 /// pushing the result onto the evaluation stack.
|
|
2830 /// </summary>
|
|
2831 /// <seealso cref="OpCodes.Shr">OpCodes.Shr</seealso>
|
|
2832 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
2833 public EmitHelper shr
|
|
2834 {
|
|
2835 get { _ilGenerator.Emit(OpCodes.Shr); return this; }
|
|
2836 }
|
|
2837
|
|
2838 /// <summary>
|
|
2839 /// Calls ILGenerator.Emit(<see cref="OpCodes.Shr_Un"/>) that
|
|
2840 /// shifts an unsigned integer value (in zeroes) to the right by a specified number of bits,
|
|
2841 /// pushing the result onto the evaluation stack.
|
|
2842 /// </summary>
|
|
2843 /// <seealso cref="OpCodes.Shr_Un">OpCodes.Shr_Un</seealso>
|
|
2844 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
2845 public EmitHelper shr_un
|
|
2846 {
|
|
2847 get { _ilGenerator.Emit(OpCodes.Shr_Un); return this; }
|
|
2848 }
|
|
2849
|
|
2850 /// <summary>
|
|
2851 /// Calls ILGenerator.Emit(<see cref="OpCodes.Sizeof"/>, type) that
|
|
2852 /// pushes the size, in bytes, of a supplied value type onto the evaluation stack.
|
|
2853 /// </summary>
|
|
2854 /// <param name="type">A Type</param>
|
|
2855 /// <seealso cref="OpCodes.Sizeof">OpCodes.Sizeof</seealso>
|
|
2856 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,Type)">ILGenerator.Emit</seealso>
|
|
2857 public EmitHelper @sizeof(Type type)
|
|
2858 {
|
|
2859 _ilGenerator.Emit(OpCodes.Sizeof, type); return this;
|
|
2860 }
|
|
2861
|
|
2862 /// <summary>
|
|
2863 /// Calls ILGenerator.Emit(<see cref="OpCodes.Starg"/>, short) that
|
|
2864 /// stores the value on top of the evaluation stack in the argument slot at a specified index.
|
|
2865 /// </summary>
|
|
2866 /// <param name="index">Slot index.</param>
|
|
2867 /// <seealso cref="OpCodes.Starg">OpCodes.Starg</seealso>
|
|
2868 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,short)">ILGenerator.Emit</seealso>
|
|
2869 public EmitHelper starg(short index)
|
|
2870 {
|
|
2871 _ilGenerator.Emit(OpCodes.Starg, index); return this;
|
|
2872 }
|
|
2873
|
|
2874 /// <summary>
|
|
2875 /// Calls ILGenerator.Emit(<see cref="OpCodes.Starg_S"/>, byte) that
|
|
2876 /// stores the value on top of the evaluation stack in the argument slot at a specified index,
|
|
2877 /// short form.
|
|
2878 /// </summary>
|
|
2879 /// <param name="index">Slot index.</param>
|
|
2880 /// <seealso cref="OpCodes.Starg_S">OpCodes.Starg_S</seealso>
|
|
2881 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,byte)">ILGenerator.Emit</seealso>
|
|
2882 public EmitHelper starg_s(byte index)
|
|
2883 {
|
|
2884 _ilGenerator.Emit(OpCodes.Starg_S, index); return this;
|
|
2885 }
|
|
2886
|
|
2887 /// <summary>
|
|
2888 /// Stores the value on top of the evaluation stack in the argument slot at a specified index.
|
|
2889 /// </summary>
|
|
2890 /// <param name="index">Slot index.</param>
|
|
2891 /// <seealso cref="OpCodes.Starg">OpCodes.Starg</seealso>
|
|
2892 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,short)">ILGenerator.Emit</seealso>
|
|
2893 public EmitHelper starg(int index)
|
|
2894 {
|
|
2895 if (index < byte. MaxValue) starg_s((byte)index);
|
|
2896 else if (index < short.MaxValue) starg ((short)index);
|
|
2897 else
|
|
2898 throw new ArgumentOutOfRangeException("index");
|
|
2899
|
|
2900 return this;
|
|
2901 }
|
|
2902
|
|
2903 /// <summary>
|
|
2904 /// Calls ILGenerator.Emit(<see cref="OpCodes.Stelem_I"/>) that
|
|
2905 /// replaces the array element at a given index with the natural int value
|
|
2906 /// on the evaluation stack.
|
|
2907 /// </summary>
|
|
2908 /// <seealso cref="OpCodes.Stelem_I">OpCodes.Stelem_I</seealso>
|
|
2909 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
2910 public EmitHelper stelem_i
|
|
2911 {
|
|
2912 get { _ilGenerator.Emit(OpCodes.Stelem_I); return this; }
|
|
2913 }
|
|
2914
|
|
2915 /// <summary>
|
|
2916 /// Calls ILGenerator.Emit(<see cref="OpCodes.Stelem_I1"/>) that
|
|
2917 /// replaces the array element at a given index with the int8 value on the evaluation stack.
|
|
2918 /// </summary>
|
|
2919 /// <seealso cref="OpCodes.Stelem_I1">OpCodes.Stelem_I1</seealso>
|
|
2920 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
2921 public EmitHelper stelem_i1
|
|
2922 {
|
|
2923 get { _ilGenerator.Emit(OpCodes.Stelem_I1); return this; }
|
|
2924 }
|
|
2925
|
|
2926 /// <summary>
|
|
2927 /// Calls ILGenerator.Emit(<see cref="OpCodes.Stelem_I2"/>) that
|
|
2928 /// replaces the array element at a given index with the int16 value on the evaluation stack.
|
|
2929 /// </summary>
|
|
2930 /// <seealso cref="OpCodes.Stelem_I2">OpCodes.Stelem_I2</seealso>
|
|
2931 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
2932 public EmitHelper stelem_i2
|
|
2933 {
|
|
2934 get { _ilGenerator.Emit(OpCodes.Stelem_I2); return this; }
|
|
2935 }
|
|
2936
|
|
2937 /// <summary>
|
|
2938 /// Calls ILGenerator.Emit(<see cref="OpCodes.Stelem_I4"/>) that
|
|
2939 /// replaces the array element at a given index with the int32 value on the evaluation stack.
|
|
2940 /// </summary>
|
|
2941 /// <seealso cref="OpCodes.Stelem_I4">OpCodes.Stelem_I4</seealso>
|
|
2942 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
2943 public EmitHelper stelem_i4
|
|
2944 {
|
|
2945 get { _ilGenerator.Emit(OpCodes.Stelem_I4); return this; }
|
|
2946 }
|
|
2947
|
|
2948 /// <summary>
|
|
2949 /// Calls ILGenerator.Emit(<see cref="OpCodes.Stelem_I8"/>) that
|
|
2950 /// replaces the array element at a given index with the int64 value on the evaluation stack.
|
|
2951 /// </summary>
|
|
2952 /// <seealso cref="OpCodes.Stelem_I8">OpCodes.Stelem_I8</seealso>
|
|
2953 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
2954 public EmitHelper stelem_i8
|
|
2955 {
|
|
2956 get { _ilGenerator.Emit(OpCodes.Stelem_I8); return this; }
|
|
2957 }
|
|
2958
|
|
2959 /// <summary>
|
|
2960 /// Calls ILGenerator.Emit(<see cref="OpCodes.Stelem_R4"/>) that
|
|
2961 /// replaces the array element at a given index with the float32 value on the evaluation stack.
|
|
2962 /// </summary>
|
|
2963 /// <seealso cref="OpCodes.Stelem_R4">OpCodes.Stelem_R4</seealso>
|
|
2964 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
2965 public EmitHelper stelem_r4
|
|
2966 {
|
|
2967 get { _ilGenerator.Emit(OpCodes.Stelem_R4); return this; }
|
|
2968 }
|
|
2969
|
|
2970 /// <summary>
|
|
2971 /// Calls ILGenerator.Emit(<see cref="OpCodes.Stelem_R8"/>) that
|
|
2972 /// replaces the array element at a given index with the float64 value on the evaluation stack.
|
|
2973 /// </summary>
|
|
2974 /// <seealso cref="OpCodes.Stelem_R8">OpCodes.Stelem_R8</seealso>
|
|
2975 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
2976 public EmitHelper stelem_r8
|
|
2977 {
|
|
2978 get { _ilGenerator.Emit(OpCodes.Stelem_R8); return this; }
|
|
2979 }
|
|
2980
|
|
2981 /// <summary>
|
|
2982 /// Calls ILGenerator.Emit(<see cref="OpCodes.Stelem_Ref"/>) that
|
|
2983 /// replaces the array element at a given index with the object ref value (type O)
|
|
2984 /// on the evaluation stack.
|
|
2985 /// </summary>
|
|
2986 /// <seealso cref="OpCodes.Stelem_Ref">OpCodes.Stelem_Ref</seealso>
|
|
2987 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
2988 public EmitHelper stelem_ref
|
|
2989 {
|
|
2990 get { _ilGenerator.Emit(OpCodes.Stelem_Ref); return this; }
|
|
2991 }
|
|
2992
|
|
2993 /// <summary>
|
|
2994 /// Calls ILGenerator.Emit(<see cref="OpCodes.Stfld"/>, <see cref="FieldInfo"/>) that
|
|
2995 /// replaces the value stored in the field of an object reference or pointer with a new value.
|
|
2996 /// </summary>
|
|
2997 /// <param name="fieldInfo">A <see cref="FieldInfo"/> representing a field.</param>
|
|
2998 /// <seealso cref="OpCodes.Stfld">OpCodes.Stfld</seealso>
|
|
2999 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,FieldInfo)">ILGenerator.Emit</seealso>
|
|
3000 public EmitHelper stfld(FieldInfo fieldInfo)
|
|
3001 {
|
|
3002 _ilGenerator.Emit(OpCodes.Stfld, fieldInfo); return this;
|
|
3003 }
|
|
3004
|
|
3005 /// <summary>
|
|
3006 /// Calls ILGenerator.Emit(<see cref="OpCodes.Stind_I"/>) that
|
|
3007 /// stores a value of type natural int at a supplied address.
|
|
3008 /// </summary>
|
|
3009 /// <seealso cref="OpCodes.Stind_I">OpCodes.Stind_I</seealso>
|
|
3010 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
3011 public EmitHelper stind_i
|
|
3012 {
|
|
3013 get { _ilGenerator.Emit(OpCodes.Stind_I); return this; }
|
|
3014 }
|
|
3015
|
|
3016 /// <summary>
|
|
3017 /// Calls ILGenerator.Emit(<see cref="OpCodes.Stind_I1"/>) that
|
|
3018 /// stores a value of type int8 at a supplied address.
|
|
3019 /// </summary>
|
|
3020 /// <seealso cref="OpCodes.Stind_I1">OpCodes.Stind_I1</seealso>
|
|
3021 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
3022 public EmitHelper stind_i1
|
|
3023 {
|
|
3024 get { _ilGenerator.Emit(OpCodes.Stind_I1); return this; }
|
|
3025 }
|
|
3026
|
|
3027 /// <summary>
|
|
3028 /// Calls ILGenerator.Emit(<see cref="OpCodes.Stind_I2"/>) that
|
|
3029 /// stores a value of type int16 at a supplied address.
|
|
3030 /// </summary>
|
|
3031 /// <seealso cref="OpCodes.Stind_I2">OpCodes.Stind_I2</seealso>
|
|
3032 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
3033 public EmitHelper stind_i2
|
|
3034 {
|
|
3035 get { _ilGenerator.Emit(OpCodes.Stind_I2); return this; }
|
|
3036 }
|
|
3037
|
|
3038 /// <summary>
|
|
3039 /// Calls ILGenerator.Emit(<see cref="OpCodes.Stind_I4"/>) that
|
|
3040 /// stores a value of type int32 at a supplied address.
|
|
3041 /// </summary>
|
|
3042 /// <seealso cref="OpCodes.Stind_I4">OpCodes.Stind_I4</seealso>
|
|
3043 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
3044 public EmitHelper stind_i4
|
|
3045 {
|
|
3046 get { _ilGenerator.Emit(OpCodes.Stind_I4); return this; }
|
|
3047 }
|
|
3048
|
|
3049 /// <summary>
|
|
3050 /// Calls ILGenerator.Emit(<see cref="OpCodes.Stind_I8"/>) that
|
|
3051 /// stores a value of type int64 at a supplied address.
|
|
3052 /// </summary>
|
|
3053 /// <seealso cref="OpCodes.Stind_I8">OpCodes.Stind_I8</seealso>
|
|
3054 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
3055 public EmitHelper stind_i8
|
|
3056 {
|
|
3057 get { _ilGenerator.Emit(OpCodes.Stind_I8); return this; }
|
|
3058 }
|
|
3059
|
|
3060 /// <summary>
|
|
3061 /// Calls ILGenerator.Emit(<see cref="OpCodes.Stind_R4"/>) that
|
|
3062 /// stores a value of type float32 at a supplied address.
|
|
3063 /// </summary>
|
|
3064 /// <seealso cref="OpCodes.Stind_R4">OpCodes.Stind_R4</seealso>
|
|
3065 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
3066 public EmitHelper stind_r4
|
|
3067 {
|
|
3068 get { _ilGenerator.Emit(OpCodes.Stind_R4); return this; }
|
|
3069 }
|
|
3070
|
|
3071 /// <summary>
|
|
3072 /// Calls ILGenerator.Emit(<see cref="OpCodes.Stind_R8"/>) that
|
|
3073 /// stores a value of type float64 at a supplied address.
|
|
3074 /// </summary>
|
|
3075 /// <seealso cref="OpCodes.Stind_R8">OpCodes.Stind_R8</seealso>
|
|
3076 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
3077 public EmitHelper stind_r8
|
|
3078 {
|
|
3079 get { _ilGenerator.Emit(OpCodes.Stind_R8); return this; }
|
|
3080 }
|
|
3081
|
|
3082 /// <summary>
|
|
3083 /// Calls ILGenerator.Emit(<see cref="OpCodes.Stind_Ref"/>) that
|
|
3084 /// stores an object reference value at a supplied address.
|
|
3085 /// </summary>
|
|
3086 /// <seealso cref="OpCodes.Stind_Ref">OpCodes.Stind_Ref</seealso>
|
|
3087 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
3088 public EmitHelper stind_ref
|
|
3089 {
|
|
3090 get { _ilGenerator.Emit(OpCodes.Stind_Ref); return this; }
|
|
3091 }
|
|
3092
|
|
3093 /// <summary>
|
|
3094 /// Stores a value of the type at a supplied address.
|
|
3095 /// </summary>
|
|
3096 /// <param name="type">A Type.</param>
|
|
3097 public EmitHelper stind(Type type)
|
|
3098 {
|
|
3099 if (type == null) throw new ArgumentNullException("type");
|
|
3100
|
|
3101 switch (Type.GetTypeCode(type))
|
|
3102 {
|
|
3103 case TypeCode.Boolean:
|
|
3104 case TypeCode.Byte:
|
|
3105 case TypeCode.SByte: stind_i1.end(); break;
|
|
3106
|
|
3107 case TypeCode.Char:
|
|
3108 case TypeCode.Int16:
|
|
3109 case TypeCode.UInt16: stind_i2.end(); break;
|
|
3110
|
|
3111 case TypeCode.Int32:
|
|
3112 case TypeCode.UInt32: stind_i4.end(); break;
|
|
3113
|
|
3114 case TypeCode.Int64:
|
|
3115 case TypeCode.UInt64: stind_i8.end(); break;
|
|
3116
|
|
3117 case TypeCode.Single: stind_r4.end(); break;
|
|
3118 case TypeCode.Double: stind_r8.end(); break;
|
|
3119
|
|
3120 default:
|
|
3121 if (type.IsClass)
|
|
3122 stind_ref.end();
|
|
3123 else if (type.IsValueType)
|
|
3124 stobj(type);
|
|
3125 else
|
|
3126 throw CreateNotExpectedTypeException(type);
|
|
3127 break;
|
|
3128 }
|
|
3129
|
|
3130 return this;
|
|
3131 }
|
|
3132
|
|
3133 /// <summary>
|
|
3134 /// Calls ILGenerator.Emit(<see cref="OpCodes.Stloc"/>, <see cref="LocalBuilder"/>) that
|
|
3135 /// pops the current value from the top of the evaluation stack and stores it
|
|
3136 /// in the local variable list at a specified index.
|
|
3137 /// </summary>
|
|
3138 /// <param name="local">A local variable.</param>
|
|
3139 /// <seealso cref="OpCodes.Stloc">OpCodes.Stloc</seealso>
|
|
3140 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,LocalBuilder)">ILGenerator.Emit</seealso>
|
|
3141 public EmitHelper stloc(LocalBuilder local)
|
|
3142 {
|
|
3143 _ilGenerator.Emit(OpCodes.Stloc, local); return this;
|
|
3144 }
|
|
3145
|
|
3146 /// <summary>
|
|
3147 /// Calls ILGenerator.Emit(<see cref="OpCodes.Stloc"/>, short) that
|
|
3148 /// pops the current value from the top of the evaluation stack and stores it
|
|
3149 /// in the local variable list at a specified index.
|
|
3150 /// </summary>
|
|
3151 /// <param name="index">A local variable index.</param>
|
|
3152 /// <seealso cref="OpCodes.Stloc">OpCodes.Stloc</seealso>
|
|
3153 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,short)">ILGenerator.Emit</seealso>
|
|
3154 public EmitHelper stloc(short index)
|
|
3155 {
|
|
3156 if (index >= byte.MinValue && index <= byte.MaxValue)
|
|
3157 return stloc_s((byte)index);
|
|
3158
|
|
3159 _ilGenerator.Emit(OpCodes.Stloc, index);
|
|
3160 return this;
|
|
3161 }
|
|
3162
|
|
3163 /// <summary>
|
|
3164 /// Calls ILGenerator.Emit(<see cref="OpCodes.Stloc_0"/>) that
|
|
3165 /// pops the current value from the top of the evaluation stack and stores it
|
|
3166 /// in the local variable list at index 0.
|
|
3167 /// </summary>
|
|
3168 /// <seealso cref="OpCodes.Stloc_0">OpCodes.Stloc_0</seealso>
|
|
3169 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
3170 public EmitHelper stloc_0
|
|
3171 {
|
|
3172 get { _ilGenerator.Emit(OpCodes.Stloc_0); return this; }
|
|
3173 }
|
|
3174
|
|
3175 /// <summary>
|
|
3176 /// Calls ILGenerator.Emit(<see cref="OpCodes.Stloc_1"/>) that
|
|
3177 /// pops the current value from the top of the evaluation stack and stores it
|
|
3178 /// in the local variable list at index 1.
|
|
3179 /// </summary>
|
|
3180 /// <seealso cref="OpCodes.Stloc_1">OpCodes.Stloc_1</seealso>
|
|
3181 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
3182 public EmitHelper stloc_1
|
|
3183 {
|
|
3184 get { _ilGenerator.Emit(OpCodes.Stloc_1); return this; }
|
|
3185 }
|
|
3186
|
|
3187 /// <summary>
|
|
3188 /// Calls ILGenerator.Emit(<see cref="OpCodes.Stloc_2"/>) that
|
|
3189 /// pops the current value from the top of the evaluation stack and stores it
|
|
3190 /// in the local variable list at index 2.
|
|
3191 /// </summary>
|
|
3192 /// <seealso cref="OpCodes.Stloc_2">OpCodes.Stloc_2</seealso>
|
|
3193 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
3194 public EmitHelper stloc_2
|
|
3195 {
|
|
3196 get { _ilGenerator.Emit(OpCodes.Stloc_2); return this; }
|
|
3197 }
|
|
3198
|
|
3199 /// <summary>
|
|
3200 /// Calls ILGenerator.Emit(<see cref="OpCodes.Stloc_3"/>) that
|
|
3201 /// pops the current value from the top of the evaluation stack and stores it
|
|
3202 /// in the local variable list at index 3.
|
|
3203 /// </summary>
|
|
3204 /// <seealso cref="OpCodes.Stloc_3">OpCodes.Stloc_3</seealso>
|
|
3205 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
3206 public EmitHelper stloc_3
|
|
3207 {
|
|
3208 get { _ilGenerator.Emit(OpCodes.Stloc_3); return this; }
|
|
3209 }
|
|
3210
|
|
3211 /// <summary>
|
|
3212 /// Calls ILGenerator.Emit(<see cref="OpCodes.Stloc_S"/>, <see cref="LocalBuilder"/>) that
|
|
3213 /// pops the current value from the top of the evaluation stack and stores it
|
|
3214 /// in the local variable list at index (short form).
|
|
3215 /// </summary>
|
|
3216 /// <param name="local">A local variable.</param>
|
|
3217 /// <seealso cref="OpCodes.Stloc_S">OpCodes.Stloc_S</seealso>
|
|
3218 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,LocalBuilder)">ILGenerator.Emit</seealso>
|
|
3219 public EmitHelper stloc_s(LocalBuilder local)
|
|
3220 {
|
|
3221 _ilGenerator.Emit(OpCodes.Stloc_S, local); return this;
|
|
3222 }
|
|
3223
|
|
3224 /// <summary>
|
|
3225 /// Calls ILGenerator.Emit(<see cref="OpCodes.Stloc_S"/>, byte) that
|
|
3226 /// pops the current value from the top of the evaluation stack and stores it
|
|
3227 /// in the local variable list at index (short form).
|
|
3228 /// </summary>
|
|
3229 /// <param name="index">A local variable index.</param>
|
|
3230 /// <seealso cref="OpCodes.Stloc_S">OpCodes.Stloc_S</seealso>
|
|
3231 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,short)">ILGenerator.Emit</seealso>
|
|
3232 public EmitHelper stloc_s(byte index)
|
|
3233 {
|
|
3234 switch (index)
|
|
3235 {
|
|
3236 case 0: stloc_0.end(); break;
|
|
3237 case 1: stloc_1.end(); break;
|
|
3238 case 2: stloc_2.end(); break;
|
|
3239 case 3: stloc_3.end(); break;
|
|
3240
|
|
3241 default:
|
|
3242 _ilGenerator.Emit(OpCodes.Stloc_S, index); break;
|
|
3243 }
|
|
3244
|
|
3245 return this;
|
|
3246 }
|
|
3247
|
|
3248 /// <summary>
|
|
3249 /// Calls ILGenerator.Emit(<see cref="OpCodes.Stobj"/>, type) that
|
|
3250 /// copies a value of a specified type from the evaluation stack into a supplied memory address.
|
|
3251 /// </summary>
|
|
3252 /// <param name="type">A Type</param>
|
|
3253 /// <seealso cref="OpCodes.Stobj">OpCodes.Stobj</seealso>
|
|
3254 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,Type)">ILGenerator.Emit</seealso>
|
|
3255 public EmitHelper stobj(Type type)
|
|
3256 {
|
|
3257 _ilGenerator.Emit(OpCodes.Stobj, type); return this;
|
|
3258 }
|
|
3259
|
|
3260 /// <summary>
|
|
3261 /// Calls ILGenerator.Emit(<see cref="OpCodes.Stsfld"/>, fieldInfo) that
|
|
3262 /// replaces the value of a static field with a value from the evaluation stack.
|
|
3263 /// </summary>
|
|
3264 /// <param name="fieldInfo">A <see cref="FieldInfo"/> representing a field.</param>
|
|
3265 /// <seealso cref="OpCodes.Stsfld">OpCodes.Stsfld</seealso>
|
|
3266 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,FieldInfo)">ILGenerator.Emit</seealso>
|
|
3267 public EmitHelper stsfld(FieldInfo fieldInfo)
|
|
3268 {
|
|
3269 _ilGenerator.Emit(OpCodes.Stsfld, fieldInfo); return this;
|
|
3270 }
|
|
3271
|
|
3272 /// <summary>
|
|
3273 /// Calls ILGenerator.Emit(<see cref="OpCodes.Sub"/>) that
|
|
3274 /// subtracts one value from another and pushes the result onto the evaluation stack.
|
|
3275 /// </summary>
|
|
3276 /// <seealso cref="OpCodes.Sub">OpCodes.Sub</seealso>
|
|
3277 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
3278 public EmitHelper sub
|
|
3279 {
|
|
3280 get { _ilGenerator.Emit(OpCodes.Sub); return this; }
|
|
3281 }
|
|
3282
|
|
3283 /// <summary>
|
|
3284 /// Calls ILGenerator.Emit(<see cref="OpCodes.Sub_Ovf"/>) that
|
|
3285 /// subtracts one integer value from another, performs an overflow check,
|
|
3286 /// and pushes the result onto the evaluation stack.
|
|
3287 /// </summary>
|
|
3288 /// <seealso cref="OpCodes.Sub_Ovf">OpCodes.Sub_Ovf</seealso>
|
|
3289 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
3290 public EmitHelper sub_ovf
|
|
3291 {
|
|
3292 get { _ilGenerator.Emit(OpCodes.Sub_Ovf); return this; }
|
|
3293 }
|
|
3294
|
|
3295 /// <summary>
|
|
3296 /// Calls ILGenerator.Emit(<see cref="OpCodes.Sub_Ovf_Un"/>) that
|
|
3297 /// subtracts one unsigned integer value from another, performs an overflow check,
|
|
3298 /// and pushes the result onto the evaluation stack.
|
|
3299 /// </summary>
|
|
3300 /// <seealso cref="OpCodes.Sub_Ovf_Un">OpCodes.Sub_Ovf_Un</seealso>
|
|
3301 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
3302 public EmitHelper sub_ovf_un
|
|
3303 {
|
|
3304 get { _ilGenerator.Emit(OpCodes.Sub_Ovf_Un); return this; }
|
|
3305 }
|
|
3306
|
|
3307 /// <summary>
|
|
3308 /// Calls ILGenerator.Emit(<see cref="OpCodes.Switch"/>, label[]) that
|
|
3309 /// implements a jump table.
|
|
3310 /// </summary>
|
|
3311 /// <param name="labels">The array of label objects to which to branch from this location.</param>
|
|
3312 /// <seealso cref="OpCodes.Switch">OpCodes.Switch</seealso>
|
|
3313 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,Label[])">ILGenerator.Emit</seealso>
|
|
3314 public EmitHelper @switch(Label[] labels)
|
|
3315 {
|
|
3316 _ilGenerator.Emit(OpCodes.Switch, labels); return this;
|
|
3317 }
|
|
3318
|
|
3319 /// <summary>
|
|
3320 /// Calls ILGenerator.Emit(<see cref="OpCodes.Tailcall"/>) that
|
|
3321 /// performs a postfixed method call instruction such that the current method's stack frame
|
|
3322 /// is removed before the actual call instruction is executed.
|
|
3323 /// </summary>
|
|
3324 /// <seealso cref="OpCodes.Tailcall">OpCodes.Tailcall</seealso>
|
|
3325 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
3326 public EmitHelper tailcall
|
|
3327 {
|
|
3328 get { _ilGenerator.Emit(OpCodes.Tailcall); return this; }
|
|
3329 }
|
|
3330
|
|
3331 /// <summary>
|
|
3332 /// Calls ILGenerator.Emit(<see cref="OpCodes.Throw"/>) that
|
|
3333 /// throws the exception object currently on the evaluation stack.
|
|
3334 /// </summary>
|
|
3335 /// <seealso cref="OpCodes.Throw">OpCodes.Throw</seealso>
|
|
3336 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
3337 public EmitHelper @throw
|
|
3338 {
|
|
3339 get { _ilGenerator.Emit(OpCodes.Throw); return this; }
|
|
3340 }
|
|
3341
|
|
3342 /// <summary>
|
|
3343 /// Calls ILGenerator.Emit(<see cref="OpCodes.Unaligned"/>, label) that
|
|
3344 /// indicates that an address currently atop the evaluation stack might not be aligned
|
|
3345 /// to the natural size of the immediately following ldind, stind, ldfld, stfld, ldobj, stobj,
|
|
3346 /// initblk, or cpblk instruction.
|
|
3347 /// </summary>
|
|
3348 /// <param name="label">The label to branch from this location.</param>
|
|
3349 /// <seealso cref="OpCodes.Unaligned">OpCodes.Unaligned</seealso>
|
|
3350 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,Label)">ILGenerator.Emit</seealso>
|
|
3351 public EmitHelper unaligned(Label label)
|
|
3352 {
|
|
3353 _ilGenerator.Emit(OpCodes.Unaligned, label); return this;
|
|
3354 }
|
|
3355
|
|
3356 /// <summary>
|
|
3357 /// Calls ILGenerator.Emit(<see cref="OpCodes.Unaligned"/>, long) that
|
|
3358 /// indicates that an address currently atop the evaluation stack might not be aligned
|
|
3359 /// to the natural size of the immediately following ldind, stind, ldfld, stfld, ldobj, stobj,
|
|
3360 /// initblk, or cpblk instruction.
|
|
3361 /// </summary>
|
|
3362 /// <param name="addr">An address is pushed onto the stack.</param>
|
|
3363 /// <seealso cref="OpCodes.Unaligned">OpCodes.Unaligned</seealso>
|
|
3364 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,long)">ILGenerator.Emit</seealso>
|
|
3365 public EmitHelper unaligned(long addr)
|
|
3366 {
|
|
3367 _ilGenerator.Emit(OpCodes.Unaligned, addr); return this;
|
|
3368 }
|
|
3369
|
|
3370 /// <summary>
|
|
3371 /// Calls ILGenerator.Emit(<see cref="OpCodes.Unbox"/>, type) that
|
|
3372 /// converts the boxed representation of a value type to its unboxed form.
|
|
3373 /// </summary>
|
|
3374 /// <param name="type">A Type</param>
|
|
3375 /// <seealso cref="OpCodes.Unbox">OpCodes.Unbox</seealso>
|
|
3376 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,Type)">ILGenerator.Emit</seealso>
|
|
3377 public EmitHelper unbox(Type type)
|
|
3378 {
|
|
3379 _ilGenerator.Emit(OpCodes.Unbox, type); return this;
|
|
3380 }
|
|
3381
|
|
3382 /// <summary>
|
|
3383 /// Calls ILGenerator.Emit(<see cref="OpCodes.Unbox_Any"/>, type) that
|
|
3384 /// converts the boxed representation of a value type to its unboxed form.
|
|
3385 /// </summary>
|
|
3386 /// <param name="type">A Type</param>
|
|
3387 /// <seealso cref="OpCodes.Unbox_Any">OpCodes.Unbox_Any</seealso>
|
|
3388 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,Type)">ILGenerator.Emit</seealso>
|
|
3389 public EmitHelper unbox_any(Type type)
|
|
3390 {
|
|
3391 _ilGenerator.Emit(OpCodes.Unbox_Any, type);
|
|
3392 return this;
|
|
3393 }
|
|
3394
|
|
3395 /// <summary>
|
|
3396 /// Calls <see cref="unbox_any(Type)"/> if given type is a value type.
|
|
3397 /// </summary>
|
|
3398 /// <param name="type">A Type</param>
|
|
3399 /// <seealso cref="OpCodes.Unbox_Any">OpCodes.Unbox</seealso>
|
|
3400 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,Type)">ILGenerator.Emit</seealso>
|
|
3401 public EmitHelper unboxIfValueType(Type type)
|
|
3402 {
|
|
3403 if (type == null) throw new ArgumentNullException("type");
|
|
3404
|
|
3405 return type.IsValueType? unbox_any(type): this;
|
|
3406 }
|
|
3407
|
|
3408 /// <summary>
|
|
3409 /// Calls ILGenerator.Emit(<see cref="OpCodes.Volatile"/>) that
|
|
3410 /// specifies that an address currently atop the evaluation stack might be volatile,
|
|
3411 /// and the results of reading that location cannot be cached or that multiple stores
|
|
3412 /// to that location cannot be suppressed.
|
|
3413 /// </summary>
|
|
3414 /// <seealso cref="OpCodes.Volatile">OpCodes.Volatile</seealso>
|
|
3415 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
3416 public EmitHelper @volatile
|
|
3417 {
|
|
3418 get { _ilGenerator.Emit(OpCodes.Volatile); return this; }
|
|
3419 }
|
|
3420
|
|
3421 /// <summary>
|
|
3422 /// Calls ILGenerator.Emit(<see cref="OpCodes.Xor"/>) that
|
|
3423 /// computes the bitwise XOR of the top two values on the evaluation stack,
|
|
3424 /// pushing the result onto the evaluation stack.
|
|
3425 /// </summary>
|
|
3426 /// <seealso cref="OpCodes.Xor">OpCodes.Xor</seealso>
|
|
3427 /// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
|
|
3428 public EmitHelper xor
|
|
3429 {
|
|
3430 get { _ilGenerator.Emit(OpCodes.Xor); return this; }
|
|
3431 }
|
|
3432
|
|
3433 /// <summary>
|
|
3434 /// Ends sequence of property calls.
|
|
3435 /// </summary>
|
|
3436 [SuppressMessage("Microsoft.Performance", "CA1822:MarkMembersAsStatic")]
|
|
3437 public void end()
|
|
3438 {
|
|
3439 }
|
|
3440
|
|
3441 #endregion
|
|
3442
|
|
3443 /// <summary>
|
|
3444 /// Loads default value of given type onto the evaluation stack.
|
|
3445 /// </summary>
|
|
3446 /// <param name="type">A Type</param>
|
|
3447 public EmitHelper LoadInitValue(Type type)
|
|
3448 {
|
|
3449 if (type == null) throw new ArgumentNullException("type");
|
|
3450
|
|
3451 switch (Type.GetTypeCode(type))
|
|
3452 {
|
|
3453 case TypeCode.Boolean:
|
|
3454 case TypeCode.Char:
|
|
3455 case TypeCode.SByte:
|
|
3456 case TypeCode.Int16:
|
|
3457 case TypeCode.Int32:
|
|
3458 case TypeCode.Byte:
|
|
3459 case TypeCode.UInt16:
|
|
3460 case TypeCode.UInt32:
|
|
3461 ldc_i4_0.end();
|
|
3462 break;
|
|
3463
|
|
3464 case TypeCode.Int64:
|
|
3465 case TypeCode.UInt64:
|
|
3466 ldc_i4_0.conv_i8.end();
|
|
3467 break;
|
|
3468
|
|
3469 case TypeCode.Single:
|
|
3470 case TypeCode.Double:
|
|
3471 ldc_r4(0).end();
|
|
3472 break;
|
|
3473
|
|
3474 case TypeCode.String:
|
|
3475 ldsfld(typeof(string).GetField("Empty"));
|
|
3476 break;
|
|
3477
|
|
3478 default:
|
|
3479 if (type.IsClass || type.IsInterface)
|
|
3480 ldnull.end();
|
|
3481 else
|
|
3482 throw CreateNotExpectedTypeException(type);
|
|
3483 break;
|
|
3484 }
|
|
3485
|
|
3486 return this;
|
|
3487 }
|
|
3488
|
|
3489 /// <summary>
|
|
3490 /// Loads supplied object value (if possible) onto the evaluation stack.
|
|
3491 /// </summary>
|
|
3492 /// <param name="o">Any object instance or null reference.</param>
|
|
3493 /// <returns>True is a value was loaded, otherwise false.</returns>
|
|
3494 public bool LoadWellKnownValue(object o)
|
|
3495 {
|
|
3496 if (o == null)
|
|
3497 ldnull.end();
|
|
3498 else
|
|
3499 switch (Type.GetTypeCode(o.GetType()))
|
|
3500 {
|
|
3501 case TypeCode.Boolean: ldc_bool((Boolean)o); break;
|
|
3502 case TypeCode.Char: ldc_i4_ ((Char) o); break;
|
|
3503 case TypeCode.Single: ldc_r4 ((Single) o); break;
|
|
3504 case TypeCode.Double: ldc_r8 ((Double) o); break;
|
|
3505 case TypeCode.String: ldstr ((String) o); break;
|
|
3506 case TypeCode.SByte: ldc_i4_ ((SByte) o); break;
|
|
3507 case TypeCode.Int16: ldc_i4_ ((Int16) o); break;
|
|
3508 case TypeCode.Int32: ldc_i4_ ((Int32) o); break;
|
|
3509 case TypeCode.Int64: ldc_i8 ((Int64) o); break;
|
|
3510 case TypeCode.Byte: ldc_i4_ ((Byte) o); break;
|
|
3511 case TypeCode.UInt16: ldc_i4_ ((UInt16) o); break;
|
|
3512 case TypeCode.UInt32: ldc_i4_ (unchecked((Int32)(UInt32)o)); break;
|
|
3513 case TypeCode.UInt64: ldc_i8 (unchecked((Int64)(UInt64)o)); break;
|
|
3514 default:
|
|
3515 return false;
|
|
3516 }
|
|
3517
|
|
3518 return true;
|
|
3519 }
|
|
3520
|
|
3521 /// <summary>
|
|
3522 /// Initialize parameter with some default value.
|
|
3523 /// </summary>
|
|
3524 /// <param name="parameterInfo">A method parameter.</param>
|
|
3525 /// <param name="index">The parameter index.</param>
|
|
3526 public EmitHelper Init(ParameterInfo parameterInfo, int index)
|
|
3527 {
|
|
3528 if (parameterInfo == null) throw new ArgumentNullException("parameterInfo");
|
|
3529
|
|
3530 Type type = TypeHelper.GetUnderlyingType(parameterInfo.ParameterType);
|
|
3531
|
|
3532 if (parameterInfo.ParameterType.IsByRef)
|
|
3533 {
|
|
3534 type = type.GetElementType();
|
|
3535
|
|
3536 return type.IsValueType && type.IsPrimitive == false?
|
|
3537 ldarg(index).initobj(type):
|
|
3538 ldarg(index).LoadInitValue(type).stind(type);
|
|
3539 }
|
|
3540 else
|
|
3541 {
|
|
3542 return type.IsValueType && type.IsPrimitive == false?
|
|
3543 ldarga(index).initobj(type):
|
|
3544 LoadInitValue(type).starg(index);
|
|
3545 }
|
|
3546 }
|
|
3547
|
|
3548 /// <summary>
|
|
3549 /// Initialize all output parameters with some default value.
|
|
3550 /// </summary>
|
|
3551 /// <param name="parameters">A method parameters array.</param>
|
|
3552 public EmitHelper InitOutParameters(ParameterInfo[] parameters)
|
|
3553 {
|
|
3554 for (int i = 0; i < parameters.Length; i++)
|
|
3555 {
|
|
3556 ParameterInfo pi = parameters[i];
|
|
3557
|
|
3558 if (pi.IsOut)
|
|
3559 Init(pi, i + 1);
|
|
3560 }
|
|
3561
|
|
3562 return this;
|
|
3563 }
|
|
3564
|
|
3565 /// <summary>
|
|
3566 /// Initialize local variable with some default value.
|
|
3567 /// </summary>
|
|
3568 /// <param name="localBuilder">A method local variable.</param>
|
|
3569 public EmitHelper Init(LocalBuilder localBuilder)
|
|
3570 {
|
|
3571 if (localBuilder == null) throw new ArgumentNullException("localBuilder");
|
|
3572
|
|
3573 Type type = localBuilder.LocalType;
|
|
3574
|
|
3575 if (type.IsEnum)
|
|
3576 type = Enum.GetUnderlyingType(type);
|
|
3577
|
|
3578 return type.IsValueType && type.IsPrimitive == false?
|
|
3579 ldloca(localBuilder).initobj(type):
|
|
3580 LoadInitValue(type).stloc(localBuilder);
|
|
3581 }
|
|
3582
|
|
3583 /// <summary>
|
|
3584 /// Loads a type instance at runtime.
|
|
3585 /// </summary>
|
|
3586 /// <param name="type">A type</param>
|
|
3587 public EmitHelper LoadType(Type type)
|
|
3588 {
|
|
3589 return type == null?
|
|
3590 ldnull:
|
|
3591 ldtoken(type).call(typeof(Type), "GetTypeFromHandle", typeof(RuntimeTypeHandle));
|
|
3592 }
|
|
3593
|
|
3594 /// <summary>
|
|
3595 /// Loads a field instance at runtime.
|
|
3596 /// </summary>
|
|
3597 /// <param name="fieldInfo">A <see cref="FieldInfo"/> representing a field.</param>
|
|
3598 public EmitHelper LoadField(FieldInfo fieldInfo)
|
|
3599 {
|
|
3600 return fieldInfo.IsStatic ? ldsfld(fieldInfo) : ldarg_0.ldfld(fieldInfo);
|
|
3601 }
|
|
3602
|
|
3603 /// <summary>
|
|
3604 /// Cast an object passed by reference to the specified type
|
|
3605 /// or unbox a boxed value type.
|
|
3606 /// </summary>
|
|
3607 /// <param name="type">A type</param>
|
|
3608 public EmitHelper CastFromObject(Type type)
|
|
3609 {
|
|
3610 if (type == null) throw new ArgumentNullException("type");
|
|
3611
|
|
3612 return
|
|
3613 type == typeof(object)? this:
|
|
3614 (type.IsValueType? unbox_any(type):
|
|
3615 castclass(type));
|
|
3616 }
|
|
3617
|
|
3618 /// <summary>
|
|
3619 /// Cast an object passed by reference to the specified type
|
|
3620 /// or unbox a boxed value type unless <paramref name="expectedType"/>
|
|
3621 /// is a parent of <paramref name="actualType"/>.
|
|
3622 /// </summary>
|
|
3623 /// <param name="expectedType">A type required.</param>
|
|
3624 /// <param name="actualType">A type available.</param>
|
|
3625 public EmitHelper CastIfNecessary(Type expectedType, Type actualType)
|
|
3626 {
|
|
3627 if (expectedType == null) throw new ArgumentNullException("expectedType");
|
|
3628 if (actualType == null) throw new ArgumentNullException("actualType");
|
|
3629
|
|
3630 return
|
|
3631 TypeHelper.IsSameOrParent(expectedType, actualType)? this:
|
|
3632 actualType.IsValueType? unbox_any(expectedType):
|
|
3633 castclass(expectedType);
|
|
3634 }
|
|
3635
|
|
3636 /// <summary>
|
|
3637 /// Increase max stack size by specified delta.
|
|
3638 /// </summary>
|
|
3639 /// <param name="size">Number of bytes to enlarge max stack size.</param>
|
|
3640 public void AddMaxStackSize(int size)
|
|
3641 {
|
|
3642 // m_maxStackSize isn't public so we need some hacking here.
|
|
3643 //
|
|
3644 FieldInfo fi = _ilGenerator.GetType().GetField(
|
|
3645 "m_maxStackSize", BindingFlags.Instance | BindingFlags.NonPublic);
|
|
3646
|
|
3647 if (fi != null)
|
|
3648 {
|
|
3649 size += (int)fi.GetValue(_ilGenerator);
|
|
3650 fi.SetValue(_ilGenerator, size);
|
|
3651 }
|
|
3652 }
|
|
3653
|
|
3654 private static Exception CreateNoSuchMethodException(Type type, string methodName)
|
|
3655 {
|
|
3656 return new InvalidOperationException(
|
|
3657 string.Format(Resources.EmitHelper_NoSuchMethod, type.FullName, methodName));
|
|
3658 }
|
|
3659
|
|
3660 private static Exception CreateNotExpectedTypeException(Type type)
|
|
3661 {
|
|
3662 return new ArgumentException(
|
|
3663 string.Format(Resources.EmitHelper_NotExpectedType, type.FullName));
|
|
3664 }
|
|
3665 }
|
|
3666 }
|