예제 #1
0
 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);
 }
예제 #2
0
 internal void GenerateArray(int length, TypeStructure type)
 {
     GeneratePrimitive(length);
     Generator.Emit(OpCodes.Newarr, type.GainType());
 }
예제 #3
0
 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());
     }
 }
예제 #4
0
 internal LocalBuilder CreateLocal(TypeStructure dt)
 {
     return Generator.DeclareLocal(dt.GainType());
 }
예제 #5
0
 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);
 }