internal static LocalBuilder DeclareLocalVariable(ILGenerator generator, Type type) { if (type.IsByRef) { type = type.GetElementType(); } if (type.IsEnum) { type = Enum.GetUnderlyingType(type); } if (AccessTools.IsClass(type)) { var v = generator.DeclareLocal(type); Emitter.Emit(generator, OpCodes.Ldnull); Emitter.Emit(generator, OpCodes.Stloc, v); return(v); } if (AccessTools.IsStruct(type)) { var v = generator.DeclareLocal(type); Emitter.Emit(generator, OpCodes.Ldloca, v); Emitter.Emit(generator, OpCodes.Initobj, type); return(v); } if (AccessTools.IsValue(type)) { var v = generator.DeclareLocal(type); if (type == typeof(float)) { Emitter.Emit(generator, OpCodes.Ldc_R4, (float)0); } else if (type == typeof(double)) { Emitter.Emit(generator, OpCodes.Ldc_R8, (double)0); } else if (type == typeof(long) || type == typeof(ulong)) { Emitter.Emit(generator, OpCodes.Ldc_I8, (long)0); } else { Emitter.Emit(generator, OpCodes.Ldc_I4, 0); } Emitter.Emit(generator, OpCodes.Stloc, v); return(v); } return(null); }
LocalBuilder DeclareLocalVariable(Type type, bool isReturnValue = false) { if (type.IsByRef && isReturnValue == false) { type = type.GetElementType(); } if (type.IsEnum) { type = Enum.GetUnderlyingType(type); } if (AccessTools.IsClass(type)) { var v = il.DeclareLocal(type); emitter.Emit(OpCodes.Ldnull); emitter.Emit(OpCodes.Stloc, v); return(v); } if (AccessTools.IsStruct(type)) { var v = il.DeclareLocal(type); emitter.Emit(OpCodes.Ldloca, v); emitter.Emit(OpCodes.Initobj, type); return(v); } if (AccessTools.IsValue(type)) { var v = il.DeclareLocal(type); if (type == typeof(float)) { emitter.Emit(OpCodes.Ldc_R4, (float)0); } else if (type == typeof(double)) { emitter.Emit(OpCodes.Ldc_R8, (double)0); } else if (type == typeof(long) || type == typeof(ulong)) { emitter.Emit(OpCodes.Ldc_I8, (long)0); } else { emitter.Emit(OpCodes.Ldc_I4, 0); } emitter.Emit(OpCodes.Stloc, v); return(v); } return(null); }
void InitializeOutParameter(int argIndex, Type type) { if (type.IsByRef) { type = type.GetElementType(); } emitter.Emit(OpCodes.Ldarg, argIndex); if (AccessTools.IsStruct(type)) { emitter.Emit(OpCodes.Initobj, type); return; } if (AccessTools.IsValue(type)) { if (type == typeof(float)) { emitter.Emit(OpCodes.Ldc_R4, (float)0); emitter.Emit(OpCodes.Stind_R4); return; } else if (type == typeof(double)) { emitter.Emit(OpCodes.Ldc_R8, (double)0); emitter.Emit(OpCodes.Stind_R8); return; } else if (type == typeof(long)) { emitter.Emit(OpCodes.Ldc_I8, (long)0); emitter.Emit(OpCodes.Stind_I8); return; } else { emitter.Emit(OpCodes.Ldc_I4, 0); emitter.Emit(OpCodes.Stind_I4); return; } } // class or default emitter.Emit(OpCodes.Ldnull); emitter.Emit(OpCodes.Stind_Ref); }
static bool PrefixAffectsOriginal(MethodInfo fix) { if (fix.ReturnType == typeof(bool)) { return(true); } return(fix.GetParameters().Any(p => { var name = p.Name; var type = p.ParameterType; if (name == INSTANCE_PARAM) { return false; } if (name == ORIGINAL_METHOD_PARAM) { return false; } if (name == STATE_VAR) { return false; } if (p.IsOut) { return true; } if (type.IsByRef) { return true; } if (AccessTools.IsValue(type) == false && AccessTools.IsStruct(type) == false) { return true; } return false; })); }