Ejemplo n.º 1
0
        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());
            }
        }
Ejemplo n.º 2
0
 void EmitArrayLength(EmitContext ec)
 {
     operand.Emit(ec);
     ec.ig.Emit(OpCodes.Ldlen);
 }
Ejemplo n.º 3
0
 void EmitUnbox(EmitContext ec)
 {
     ec.ig.Emit(OpCodes.Unbox_Any, Type);
 }
Ejemplo n.º 4
0
        void EmitPrimitiveConversion(EmitContext ec)
        {
            operand.Emit(ec);

            EmitPrimitiveConversion(ec, operand.Type, Type);
        }
Ejemplo n.º 5
0
 void EmitConvertFromNullableToNullable(EmitContext ec)
 {
     EmitLiftedUnary(ec);
 }
Ejemplo n.º 6
0
 void EmitBox(EmitContext ec)
 {
     ec.ig.Emit(OpCodes.Box, operand.Type);
 }
Ejemplo n.º 7
0
        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));
        }
Ejemplo n.º 8
0
 internal override void Emit(EmitContext ec)
 {
     member.OnFieldOrProperty(
         field => EmitFieldAccess(ec, field),
         prop => EmitPropertyAccess(ec, prop));
 }
Ejemplo n.º 9
0
 private void EmitLocalParameter(EmitContext ec, int position)
 {
     ec.ig.Emit(OpCodes.Ldarg, position);
 }
Ejemplo n.º 10
0
 internal override void Emit(EmitContext ec)
 {
     ec.EmitCall(expression, arguments, expression.Type.GetInvokeMethod());
 }
Ejemplo n.º 11
0
 internal override void Emit(EmitContext ec)
 {
     ec.EmitCall(obj, arguments, method);
 }