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]); }
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); } }
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; } }
public override void Load() { if (!FieldInfo.IsStatic) { Generator_.Emit(OpCodes.Ldarg_0); Generator_.Emit(OpCodes.Ldfld, FieldInfo); } else { Generator_.Emit(OpCodes.Ldsfld, FieldInfo); } }