Exemple #1
0
        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);
        }
Exemple #2
0
        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);
        }
Exemple #3
0
        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);
        }
Exemple #4
0
        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;
            }));
        }