internal void GenerateList(TypeStructure type, IReadOnlyList<CilStructure> values) { var lt = type.GainType(); var lc = lt.GetConstructor(Type.EmptyTypes); var ladd = lt.GetMethod("Add"); var local = Generator.DeclareLocal(lt); Generator.Emit(OpCodes.Newobj, lc); Generator.Emit(OpCodes.Stloc, local); foreach (var v in values) { Generator.Emit(OpCodes.Ldloc, local); var exp = (ExpressionStructure)v; exp.BuildCode(); Generator.Emit(OpCodes.Call, ladd); } Generator.Emit(OpCodes.Ldloc, local); }
internal void GenerateArray(int length, TypeStructure type) { GeneratePrimitive(length); Generator.Emit(OpCodes.Newarr, type.GainType()); }
internal void GenerateToAddress(TypeStructure from, TypeStructure to) { if(from.IsValueType && to.IsReferType) { Generator.Emit(OpCodes.Box, from.GainType()); } else if(from.IsReferType && to.IsValueType) { Generator.Emit(OpCodes.Unbox, to.GainType()); } }
internal LocalBuilder CreateLocal(TypeStructure dt) { return Generator.DeclareLocal(dt.GainType()); }
internal void GenerateStoreElement(TypeStructure type) { var t = type.GainType(); if(t.IsClass || t.IsInterface) { Generator.Emit(OpCodes.Stelem_Ref); } else if (t == typeof(IntPtr)) Generator.Emit(OpCodes.Stelem_I); else if (t == typeof(SByte)) Generator.Emit(OpCodes.Stelem_I1); else if (t == typeof(Int16)) Generator.Emit(OpCodes.Stelem_I2); else if (t == typeof(Int32)) Generator.Emit(OpCodes.Stelem_I4); else if (t == typeof(Int64)) Generator.Emit(OpCodes.Stelem_I8); else if (t == typeof(Single)) Generator.Emit(OpCodes.Stelem_R4); else if (t == typeof(Double)) Generator.Emit(OpCodes.Stelem_R8); else Generator.Emit(OpCodes.Stelem); }