Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches

◆ AddMethodImpl()

MethodBuilder System.Reflection.DispatchProxyGenerator.ProxyBuilder.AddMethodImpl ( MethodInfo mi,
int methodInfoIndex )
inlineprivate

Definition at line 425 of file DispatchProxyGenerator.cs.

426 {
427 ParameterInfo[] parameters = mi.GetParameters();
428 Type[] array = new Type[parameters.Length];
429 Type[][] array2 = new Type[array.Length][];
430 for (int i = 0; i < parameters.Length; i++)
431 {
432 array[i] = parameters[i].ParameterType;
433 array2[i] = parameters[i].GetRequiredCustomModifiers();
434 }
435 MethodBuilder methodBuilder = _tb.DefineMethod(mi.Name, MethodAttributes.Public | MethodAttributes.Virtual, CallingConventions.Standard, mi.ReturnType, null, null, array, array2, null);
436 if (mi.ContainsGenericParameters)
437 {
438 Type[] genericArguments = mi.GetGenericArguments();
439 string[] array3 = new string[genericArguments.Length];
440 for (int j = 0; j < genericArguments.Length; j++)
441 {
442 array3[j] = genericArguments[j].Name;
443 }
444 GenericTypeParameterBuilder[] array4 = methodBuilder.DefineGenericParameters(array3);
445 for (int k = 0; k < array4.Length; k++)
446 {
447 array4[k].SetGenericParameterAttributes(genericArguments[k].GenericParameterAttributes);
448 }
449 }
450 ILGenerator iLGenerator = methodBuilder.GetILGenerator();
451 ParametersArray parametersArray = new ParametersArray(iLGenerator, array);
452 iLGenerator.Emit(OpCodes.Nop);
454 for (int l = 0; l < parameters.Length; l++)
455 {
456 if (!parameters[l].IsOut || !parameters[l].ParameterType.IsByRef || parameters[l].IsIn)
457 {
458 genericArray.BeginSet(l);
459 parametersArray.Get(l);
460 genericArray.EndSet(parameters[l].ParameterType);
461 }
462 }
463 LocalBuilder local = iLGenerator.DeclareLocal(typeof(MethodInfo));
469 if (mi.ContainsGenericParameters)
470 {
472 Type[] genericArguments2 = mi.GetGenericArguments();
474 for (int m = 0; m < genericArguments2.Length; m++)
475 {
476 genericArray2.BeginSet(m);
479 genericArray2.EndSet(typeof(Type));
480 }
481 genericArray2.Load();
484 }
485 LocalBuilder localBuilder = ((mi.ReturnType != typeof(void)) ? iLGenerator.DeclareLocal(typeof(object)) : null);
488 genericArray.Load();
490 if (localBuilder != null)
491 {
493 }
494 else
495 {
496 iLGenerator.Emit(OpCodes.Pop);
497 }
498 for (int n = 0; n < parameters.Length; n++)
499 {
500 if (parameters[n].ParameterType.IsByRef)
501 {
502 parametersArray.BeginSet(n);
503 genericArray.Get(n);
504 parametersArray.EndSet(n, typeof(object));
505 }
506 }
507 if (localBuilder != null)
508 {
510 Convert(iLGenerator, typeof(object), mi.ReturnType, isAddress: false);
511 }
512 iLGenerator.Emit(OpCodes.Ret);
514 return methodBuilder;
515 }
static void Convert(ILGenerator il, Type source, Type target, bool isAddress)
static readonly MethodInfo s_dispatchProxyInvokeMethod
static readonly OpCode Callvirt
Definition OpCodes.cs:225
static readonly OpCode Stloc
Definition OpCodes.cs:429
static readonly OpCode Ldc_I4
Definition OpCodes.cs:69
static readonly OpCode Ldfld
Definition OpCodes.cs:245
static readonly OpCode Ldelem_Ref
Definition OpCodes.cs:307
static readonly OpCode Pop
Definition OpCodes.cs:79
static readonly OpCode Ldtoken
Definition OpCodes.cs:353
static readonly OpCode Call
Definition OpCodes.cs:83
static readonly OpCode Nop
Definition OpCodes.cs:5
static readonly OpCode Ret
Definition OpCodes.cs:87
static readonly OpCode Ldloc
Definition OpCodes.cs:425
static readonly OpCode Ldarg_0
Definition OpCodes.cs:9
static int DefineMethod(QCallModule module, int tkParent, string name, byte[] signature, int sigLength, MethodAttributes attributes)
void DefineMethodOverride(MethodInfo methodInfoBody, MethodInfo methodInfoDeclaration)

References System.Reflection.DispatchProxyGenerator.ProxyBuilder._fields, System.Reflection.DispatchProxyGenerator.ProxyBuilder._tb, System.array, System.Reflection.Emit.OpCodes.Call, System.Reflection.Emit.OpCodes.Callvirt, System.Reflection.DispatchProxyGenerator.ProxyBuilder.Convert(), System.Reflection.Emit.TypeBuilder.DefineMethod(), System.Reflection.Emit.TypeBuilder.DefineMethodOverride(), System.Reflection.ParameterInfo.GetRequiredCustomModifiers(), System.Reflection.ParameterInfo.IsIn, System.Reflection.Emit.OpCodes.Ldarg_0, System.Reflection.Emit.OpCodes.Ldc_I4, System.Reflection.Emit.OpCodes.Ldelem_Ref, System.Reflection.Emit.OpCodes.Ldfld, System.Reflection.Emit.OpCodes.Ldloc, System.Reflection.Emit.OpCodes.Ldtoken, System.Reflection.Emit.OpCodes.Nop, System.Reflection.ParameterInfo.ParameterType, System.Reflection.Emit.OpCodes.Pop, System.Reflection.Emit.OpCodes.Ret, System.Reflection.DispatchProxyGenerator.s_dispatchProxyInvokeMethod, System.Reflection.DispatchProxyGenerator.s_getTypeFromHandleMethod, System.Reflection.DispatchProxyGenerator.s_makeGenericMethodMethod, and System.Reflection.Emit.OpCodes.Stloc.

Referenced by System.Reflection.DispatchProxyGenerator.ProxyBuilder.AddInterfaceImpl().