Esempio n. 1
0
        public static LocalObjectDef AllocateLocal(Type type, string name = "")
        {
            List <LocalObjectDef> duplicatedLocals = new List <LocalObjectDef>();
            int number = 0;
            int i;

            for (i = 0; i < Locals_.Count; i++)
            {
                if (Locals_[i].Scope == enmObjectScope.Local && (Locals_[i] as LocalObjectDef).Name == name && name != "")
                {
                    duplicatedLocals.Add(Locals_[i] as LocalObjectDef);
                    Locals_[i].IsUsed = false;
                }
            }

            for (i = 0; i < Locals_.Count; i++)
            {
                if (Locals_[i].Type.Name == type.Name && !Locals_[i].IsUsed)
                {
                    number     = i;
                    Locals_[i] = new LocalObjectDef(type, number, name);
                    break;
                }
            }
            if (i == Locals_.Count)
            {
                var localVar = Generator_.DeclareLocal(type);
                number = localVar.LocalIndex;
                Locals_.Add(new LocalObjectDef(type, number, name));
            }
            EmitSaveToLocal(number);
            return(Locals_[number]);
        }
Esempio n. 2
0
 public override void Load()
 {
     if (Type == typeof(int))
     {
         EmitInteger((int)Value);
     }
     else if (Type == typeof(bool))
     {
         var boolean = (bool)Value;
         if (boolean)
         {
             Generator_.Emit(OpCodes.Ldc_I4_1);
         }
         else
         {
             Generator_.Emit(OpCodes.Ldc_I4_0);
         }
     }
     else if (Type == typeof(string))
     {
         Generator_.Emit(OpCodes.Ldstr, (string)Value);
     }
     else
     if (Builder == null)
     {
         Generator_.Emit(OpCodes.Ldnull);
     }
     else
     {
         Generator_.Emit(OpCodes.Newobj, Builder);
     }
 }
Esempio n. 3
0
        public override void Load()
        {
            switch (Number)
            {
            case 0:
                Generator_.Emit(OpCodes.Ldarg_0);
                break;

            case 1:
                Generator_.Emit(OpCodes.Ldarg_1);
                break;

            case 2:
                Generator_.Emit(OpCodes.Ldarg_2);
                break;

            case 3:
                Generator_.Emit(OpCodes.Ldarg_3);
                break;

            default:
                if (Number < 256)
                {
                    Generator_.Emit(OpCodes.Ldarg_S, Number);
                }
                else
                {
                    Generator_.Emit(OpCodes.Ldarg, Number);
                }
                break;
            }
        }
Esempio n. 4
0
 public override void Load()
 {
     if (!FieldInfo.IsStatic)
     {
         Generator_.Emit(OpCodes.Ldarg_0);
         Generator_.Emit(OpCodes.Ldfld, FieldInfo);
     }
     else
     {
         Generator_.Emit(OpCodes.Ldsfld, FieldInfo);
     }
 }