/// <summary>Loads the local variable at index i onto the evaluation stack.</summary> public static ILSugar LoadVariable(this ILSugar il, int i) { switch (i) { case 0: il.Ldloc_0(); break; case 1: il.Ldloc_1(); break; case 2: il.Ldloc_2(); break; case 3: il.Ldloc_3(); break; default: if (i <= byte.MaxValue) { il.Ldloc_S((byte)i); } else { il.Ldloc(i); } break; } return(il); }
internal static void EmitCallMethod(this ILSugar il, MethodInfo method) { var type = method.DeclaringType ?? throw new NullReferenceException(); if (!method.IsStatic) { il.Ldarg_1(); // target il.Unbox_Any(type); var @this = il.DeclareLocal(type); il.Stloc(@this); if (type.IsValueType) { il.Ldloca(@this); } else { il.Ldloc(@this); } } var parameters = method.GetParameters(); if (parameters.Length > 0) { for (var i = 0; i < parameters.Length; i++) { il.Ldarg_2(); // args il.LoadConstant(i); // i il.Ldelem_Ref(); // args[i] var parameterType = parameters[i].ParameterType; var byRef = parameterType.IsByRef; if (byRef) { parameterType = parameterType.GetElementType(); } il.Unbox_Any(parameterType); var arg = il.DeclareLocal(parameterType); il.Stloc(arg); if (byRef) { il.Ldloca(arg); } else { il.Ldloc(arg); } } } il.CallOrCallvirt(type, method); for (var i = 0; i < parameters.Length; i++) { var parameterType = parameters[i].ParameterType; if (!parameterType.IsByRef) { continue; } il.Ldarg_2(); il.Ldc_I4(i); il.Ldloc(i + (method.IsStatic ? 0 : 1)); parameterType = parameterType.GetElementType() ?? parameterType; if (parameterType.IsValueType) { il.Box(parameterType); } il.Stelem_Ref(); } if (method.ReturnType == typeof(void)) { il.Ldnull(); } else { il.MaybeBox(method.ReturnType); } il.Ret(); }