Exemple #1
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);
        }
        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);
        }