Beispiel #1
0
 public static LocalBuilder[] DeclareLocalVariables(MethodBase original, ILGenerator il)
 {
     return(original.GetMethodBody().LocalVariables.Select(lvi =>
     {
         var localBuilder = il.DeclareLocal(lvi.LocalType, lvi.IsPinned);
         Emitter.LogLastLocalVariable(il);
         return localBuilder;
     }).ToArray());
 }
Beispiel #2
0
        public static LocalBuilder DeclareLocalVariable(ILGenerator il, Type type)
        {
            if (type.IsByRef)
            {
                type = type.GetElementType();
            }

            if (AccessTools.isClass(type))
            {
                var v = il.DeclareLocal(type);
                Emitter.LogLastLocalVariable(il);
                Emitter.Emit(il, OpCodes.Ldnull);
                Emitter.Emit(il, OpCodes.Stloc, v);
                return(v);
            }
            if (AccessTools.isStruct(type))
            {
                var v = il.DeclareLocal(type);
                Emitter.LogLastLocalVariable(il);
                Emitter.Emit(il, OpCodes.Ldloca, v);
                Emitter.Emit(il, OpCodes.Initobj, type);
                return(v);
            }
            if (AccessTools.isValue(type))
            {
                var v = il.DeclareLocal(type);
                Emitter.LogLastLocalVariable(il);
                if (type == typeof(float))
                {
                    Emitter.Emit(il, OpCodes.Ldc_R4, (float)0);
                }
                else if (type == typeof(double))
                {
                    Emitter.Emit(il, OpCodes.Ldc_R8, (double)0);
                }
                else if (type == typeof(long))
                {
                    Emitter.Emit(il, OpCodes.Ldc_I8, (long)0);
                }
                else
                {
                    Emitter.Emit(il, OpCodes.Ldc_I4, 0);
                }
                Emitter.Emit(il, OpCodes.Stloc, v);
                return(v);
            }
            return(null);
        }