void EmitPrimitiveConversion(EmitContext ec, Type from, Type to) { var is_unsigned = IsUnsigned(from); switch (Type.GetTypeCode(to)) { case TypeCode.SByte: EmitPrimitiveConversion(ec, is_unsigned, OpCodes.Conv_I1, OpCodes.Conv_U1, OpCodes.Conv_Ovf_I1, OpCodes.Conv_Ovf_I1_Un); return; case TypeCode.Byte: EmitPrimitiveConversion(ec, is_unsigned, OpCodes.Conv_I1, OpCodes.Conv_U1, OpCodes.Conv_Ovf_U1, OpCodes.Conv_Ovf_U1_Un); return; case TypeCode.Int16: EmitPrimitiveConversion(ec, is_unsigned, OpCodes.Conv_I2, OpCodes.Conv_U2, OpCodes.Conv_Ovf_I2, OpCodes.Conv_Ovf_I2_Un); return; case TypeCode.UInt16: EmitPrimitiveConversion(ec, is_unsigned, OpCodes.Conv_I2, OpCodes.Conv_U2, OpCodes.Conv_Ovf_U2, OpCodes.Conv_Ovf_U2_Un); return; case TypeCode.Int32: EmitPrimitiveConversion(ec, is_unsigned, OpCodes.Conv_I4, OpCodes.Conv_U4, OpCodes.Conv_Ovf_I4, OpCodes.Conv_Ovf_I4_Un); return; case TypeCode.UInt32: EmitPrimitiveConversion(ec, is_unsigned, OpCodes.Conv_I4, OpCodes.Conv_U4, OpCodes.Conv_Ovf_U4, OpCodes.Conv_Ovf_U4_Un); return; case TypeCode.Int64: EmitPrimitiveConversion(ec, is_unsigned, OpCodes.Conv_I8, OpCodes.Conv_U8, OpCodes.Conv_Ovf_I8, OpCodes.Conv_Ovf_I8_Un); return; case TypeCode.UInt64: EmitPrimitiveConversion(ec, is_unsigned, OpCodes.Conv_I8, OpCodes.Conv_U8, OpCodes.Conv_Ovf_U8, OpCodes.Conv_Ovf_U8_Un); return; case TypeCode.Single: if (is_unsigned) { ec.ig.Emit(OpCodes.Conv_R_Un); } ec.ig.Emit(OpCodes.Conv_R4); return; case TypeCode.Double: if (is_unsigned) { ec.ig.Emit(OpCodes.Conv_R_Un); } ec.ig.Emit(OpCodes.Conv_R8); return; default: throw new NotImplementedException(this.Type.ToString()); } }
void EmitArrayLength(EmitContext ec) { operand.Emit(ec); ec.ig.Emit(OpCodes.Ldlen); }
void EmitUnbox(EmitContext ec) { ec.ig.Emit(OpCodes.Unbox_Any, Type); }
void EmitPrimitiveConversion(EmitContext ec) { operand.Emit(ec); EmitPrimitiveConversion(ec, operand.Type, Type); }
void EmitConvertFromNullableToNullable(EmitContext ec) { EmitLiftedUnary(ec); }
void EmitBox(EmitContext ec) { ec.ig.Emit(OpCodes.Box, operand.Type); }
internal override void Emit(EmitContext ec) { ILGenerator ig = ec.ig; switch (Type.GetTypeCode(Type)) { case TypeCode.Byte: ig.Emit(OpCodes.Ldc_I4, (int)((byte)value)); return; case TypeCode.SByte: ig.Emit(OpCodes.Ldc_I4, (int)((sbyte)value)); return; case TypeCode.Int16: ig.Emit(OpCodes.Ldc_I4, (int)((short)value)); return; case TypeCode.UInt16: ig.Emit(OpCodes.Ldc_I4, (int)((ushort)value)); return; case TypeCode.Int32: ig.Emit(OpCodes.Ldc_I4, (int)value); return; case TypeCode.UInt32: ig.Emit(OpCodes.Ldc_I4, unchecked ((int)((uint)Value))); return; case TypeCode.Int64: ig.Emit(OpCodes.Ldc_I8, (long)value); return; case TypeCode.UInt64: ig.Emit(OpCodes.Ldc_I8, unchecked ((long)((ulong)value))); return; case TypeCode.Boolean: if ((bool)Value) { ig.Emit(OpCodes.Ldc_I4_1); } else { ec.ig.Emit(OpCodes.Ldc_I4_0); } return; case TypeCode.Char: ig.Emit(OpCodes.Ldc_I4, (int)((char)value)); return; case TypeCode.Single: ig.Emit(OpCodes.Ldc_R4, (float)value); return; case TypeCode.Double: ig.Emit(OpCodes.Ldc_R8, (double)value); return; case TypeCode.Decimal: { Decimal v = (decimal)value; int [] words = Decimal.GetBits(v); int power = (words [3] >> 16) & 0xff; Type ti = typeof(int); if (power == 0 && v <= int.MaxValue && v >= int.MinValue) { ig.Emit(OpCodes.Ldc_I4, (int)v); ig.Emit(OpCodes.Newobj, typeof(Decimal).GetConstructor(new Type [1] { ti })); return; } ig.Emit(OpCodes.Ldc_I4, words [0]); ig.Emit(OpCodes.Ldc_I4, words [1]); ig.Emit(OpCodes.Ldc_I4, words [2]); // sign ig.Emit(OpCodes.Ldc_I4, words [3] >> 31); // power ig.Emit(OpCodes.Ldc_I4, power); ig.Emit(OpCodes.Newobj, typeof(Decimal).GetConstructor(new Type [5] { ti, ti, ti, typeof(bool), typeof(byte) })); return; } case TypeCode.DateTime: { var date = (DateTime)value; var local = ig.DeclareLocal(typeof(DateTime)); ig.Emit(OpCodes.Ldloca, local); ig.Emit(OpCodes.Ldc_I8, date.Ticks); ig.Emit(OpCodes.Ldc_I4, (int)date.Kind); ig.Emit(OpCodes.Call, typeof(DateTime).GetConstructor(new [] { typeof(long), typeof(DateTimeKind) })); ig.Emit(OpCodes.Ldloc, local); return; } case TypeCode.DBNull: ig.Emit(OpCodes.Ldsfld, typeof(DBNull).GetField("Value", BindingFlags.Public | BindingFlags.Static)); return; case TypeCode.String: EmitIfNotNull(ec, c => c.ig.Emit(OpCodes.Ldstr, (string)value)); return; case TypeCode.Object: EmitIfNotNull(ec, c => c.EmitReadGlobal(value)); return; } throw new NotImplementedException(String.Format("No support for constants of type {0} yet", Type)); }
internal override void Emit(EmitContext ec) { member.OnFieldOrProperty( field => EmitFieldAccess(ec, field), prop => EmitPropertyAccess(ec, prop)); }
private void EmitLocalParameter(EmitContext ec, int position) { ec.ig.Emit(OpCodes.Ldarg, position); }
internal override void Emit(EmitContext ec) { ec.EmitCall(expression, arguments, expression.Type.GetInvokeMethod()); }
internal override void Emit(EmitContext ec) { ec.EmitCall(obj, arguments, method); }