Exemplo n.º 1
0
 public static SpecialType GetTypeFromMetadataName(StarkPlatform.Cci.PrimitiveTypeCode typeCode)
 {
     return(s_typeCodeToTypeIdMap[(int)typeCode]);
 }
Exemplo n.º 2
0
 /// <summary>
 /// Get symbol for predefined type from Cor Library used by this assembly.
 /// </summary>
 /// <param name="type"></param>
 /// <returns></returns>
 internal NamedTypeSymbol GetPrimitiveType(StarkPlatform.Cci.PrimitiveTypeCode type)
 {
     return(GetSpecialType(SpecialTypes.GetTypeFromMetadataName(type)));
 }
Exemplo n.º 3
0
        public void EmitNumericConversion(StarkPlatform.Cci.PrimitiveTypeCode fromPredefTypeKind, StarkPlatform.Cci.PrimitiveTypeCode toPredefTypeKind, bool @checked)
        {
            bool fromUnsigned = fromPredefTypeKind.IsUnsigned();

            switch (toPredefTypeKind)
            {
            case StarkPlatform.Cci.PrimitiveTypeCode.Int8:
                switch (fromPredefTypeKind)
                {
                case StarkPlatform.Cci.PrimitiveTypeCode.Int8:
                    break;         // NOP

                default:
                    if (@checked)
                    {
                        this.EmitOpCode(fromUnsigned ? ILOpCode.Conv_ovf_i1_un : ILOpCode.Conv_ovf_i1);
                    }
                    else
                    {
                        this.EmitOpCode(ILOpCode.Conv_i1);
                    }
                    break;
                }
                break;

            case StarkPlatform.Cci.PrimitiveTypeCode.UInt8:
                switch (fromPredefTypeKind)
                {
                case StarkPlatform.Cci.PrimitiveTypeCode.UInt8:
                    break;         // NOP

                default:
                    if (@checked)
                    {
                        this.EmitOpCode(fromUnsigned ? ILOpCode.Conv_ovf_u1_un : ILOpCode.Conv_ovf_u1);
                    }
                    else
                    {
                        this.EmitOpCode(ILOpCode.Conv_u1);
                    }
                    break;
                }
                break;

            case StarkPlatform.Cci.PrimitiveTypeCode.Int16:
                switch (fromPredefTypeKind)
                {
                case StarkPlatform.Cci.PrimitiveTypeCode.Int8:
                case StarkPlatform.Cci.PrimitiveTypeCode.UInt8:
                case StarkPlatform.Cci.PrimitiveTypeCode.Int16:
                    break;         // NOP

                default:
                    if (@checked)
                    {
                        this.EmitOpCode(fromUnsigned ? ILOpCode.Conv_ovf_i2_un : ILOpCode.Conv_ovf_i2);
                    }
                    else
                    {
                        this.EmitOpCode(ILOpCode.Conv_i2);
                    }
                    break;
                }
                break;

            case StarkPlatform.Cci.PrimitiveTypeCode.Rune:
            case StarkPlatform.Cci.PrimitiveTypeCode.UInt16:
                switch (fromPredefTypeKind)
                {
                case StarkPlatform.Cci.PrimitiveTypeCode.UInt8:
                case StarkPlatform.Cci.PrimitiveTypeCode.UInt16:
                case StarkPlatform.Cci.PrimitiveTypeCode.Rune:
                    break;         // NOP

                default:
                    if (@checked)
                    {
                        this.EmitOpCode(fromUnsigned ? ILOpCode.Conv_ovf_u2_un : ILOpCode.Conv_ovf_u2);
                    }
                    else
                    {
                        this.EmitOpCode(ILOpCode.Conv_u2);
                    }
                    break;
                }
                break;

            case StarkPlatform.Cci.PrimitiveTypeCode.Int32:
                switch (fromPredefTypeKind)
                {
                case StarkPlatform.Cci.PrimitiveTypeCode.Int8:
                case StarkPlatform.Cci.PrimitiveTypeCode.UInt8:
                case StarkPlatform.Cci.PrimitiveTypeCode.Int16:
                case StarkPlatform.Cci.PrimitiveTypeCode.UInt16:
                case StarkPlatform.Cci.PrimitiveTypeCode.Int32:
                case StarkPlatform.Cci.PrimitiveTypeCode.Rune:
                    break;         // NOP

                case StarkPlatform.Cci.PrimitiveTypeCode.UInt32:
                    if (@checked)
                    {
                        this.EmitOpCode(ILOpCode.Conv_ovf_i4_un);
                    }
                    break;         // NOP in unchecked

                default:
                    if (@checked)
                    {
                        this.EmitOpCode(fromUnsigned ? ILOpCode.Conv_ovf_i4_un : ILOpCode.Conv_ovf_i4);
                    }
                    else
                    {
                        this.EmitOpCode(ILOpCode.Conv_i4);
                    }
                    break;
                }
                break;

            case StarkPlatform.Cci.PrimitiveTypeCode.UInt32:
                switch (fromPredefTypeKind)
                {
                case StarkPlatform.Cci.PrimitiveTypeCode.UInt8:
                case StarkPlatform.Cci.PrimitiveTypeCode.UInt16:
                case StarkPlatform.Cci.PrimitiveTypeCode.UInt32:
                case StarkPlatform.Cci.PrimitiveTypeCode.Rune:
                    break;         // NOP

                case StarkPlatform.Cci.PrimitiveTypeCode.Int8:
                case StarkPlatform.Cci.PrimitiveTypeCode.Int16:
                case StarkPlatform.Cci.PrimitiveTypeCode.Int32:
                    if (@checked)
                    {
                        this.EmitOpCode(ILOpCode.Conv_ovf_u4);
                    }
                    break;         // NOP in unchecked

                default:
                    if (@checked)
                    {
                        this.EmitOpCode(fromUnsigned ? ILOpCode.Conv_ovf_u4_un : ILOpCode.Conv_ovf_u4);
                    }
                    else
                    {
                        this.EmitOpCode(ILOpCode.Conv_u4);
                    }
                    break;
                }
                break;

            case StarkPlatform.Cci.PrimitiveTypeCode.IntPtr:
                switch (fromPredefTypeKind)
                {
                case StarkPlatform.Cci.PrimitiveTypeCode.IntPtr:
                    break;         // NOP

                case StarkPlatform.Cci.PrimitiveTypeCode.Int8:
                case StarkPlatform.Cci.PrimitiveTypeCode.Int16:
                case StarkPlatform.Cci.PrimitiveTypeCode.Int32:
                    this.EmitOpCode(ILOpCode.Conv_i);         // potentially widening, so not NOP
                    break;

                case StarkPlatform.Cci.PrimitiveTypeCode.UInt8:
                case StarkPlatform.Cci.PrimitiveTypeCode.UInt16:
                case StarkPlatform.Cci.PrimitiveTypeCode.Rune:
                    // Doesn't actually matter whether we sign extend, because
                    // bit 32 can't be set in any of these types.
                    this.EmitOpCode(ILOpCode.Conv_u);         // potentially widening, so not NOP
                    break;

                case StarkPlatform.Cci.PrimitiveTypeCode.UInt32:
                    if (@checked)
                    {
                        this.EmitOpCode(ILOpCode.Conv_ovf_i_un);
                    }
                    else
                    {
                        // Don't want to sign extend if this is a widening conversion.
                        this.EmitOpCode(ILOpCode.Conv_u);         // potentially widening, so not NOP
                    }
                    break;

                default:
                    if (@checked)
                    {
                        this.EmitOpCode(fromUnsigned ? ILOpCode.Conv_ovf_i_un : ILOpCode.Conv_ovf_i);
                    }
                    else
                    {
                        this.EmitOpCode(ILOpCode.Conv_i);
                    }
                    break;
                }
                break;

            case StarkPlatform.Cci.PrimitiveTypeCode.UIntPtr:
                switch (fromPredefTypeKind)
                {
                case StarkPlatform.Cci.PrimitiveTypeCode.UIntPtr:
                    break;         // NOP

                case StarkPlatform.Cci.PrimitiveTypeCode.UInt8:
                case StarkPlatform.Cci.PrimitiveTypeCode.UInt16:
                case StarkPlatform.Cci.PrimitiveTypeCode.UInt32:
                case StarkPlatform.Cci.PrimitiveTypeCode.Rune:
                    this.EmitOpCode(ILOpCode.Conv_u);         // potentially widening, so not NOP
                    break;

                case StarkPlatform.Cci.PrimitiveTypeCode.Int8:
                case StarkPlatform.Cci.PrimitiveTypeCode.Int16:
                case StarkPlatform.Cci.PrimitiveTypeCode.Int32:
                    if (@checked)
                    {
                        this.EmitOpCode(ILOpCode.Conv_ovf_u);
                    }
                    else
                    {
                        this.EmitOpCode(ILOpCode.Conv_i);         // potentially widening, so not NOP
                    }
                    break;

                default:
                    if (@checked)
                    {
                        this.EmitOpCode(fromUnsigned ? ILOpCode.Conv_ovf_u_un : ILOpCode.Conv_ovf_u);
                    }
                    else
                    {
                        this.EmitOpCode(ILOpCode.Conv_u);
                    }
                    break;
                }
                break;

            case StarkPlatform.Cci.PrimitiveTypeCode.Int64:
                switch (fromPredefTypeKind)
                {
                case StarkPlatform.Cci.PrimitiveTypeCode.Int64:
                    break;         //NOP

                case StarkPlatform.Cci.PrimitiveTypeCode.Int8:
                case StarkPlatform.Cci.PrimitiveTypeCode.Int16:
                case StarkPlatform.Cci.PrimitiveTypeCode.Int32:
                case StarkPlatform.Cci.PrimitiveTypeCode.IntPtr:
                    this.EmitOpCode(ILOpCode.Conv_i8);         // sign extend
                    break;

                case StarkPlatform.Cci.PrimitiveTypeCode.UInt8:
                case StarkPlatform.Cci.PrimitiveTypeCode.UInt16:
                case StarkPlatform.Cci.PrimitiveTypeCode.UInt32:
                case StarkPlatform.Cci.PrimitiveTypeCode.Rune:
                    this.EmitOpCode(ILOpCode.Conv_u8);         // 0 extend
                    break;

                case StarkPlatform.Cci.PrimitiveTypeCode.Pointer:
                case StarkPlatform.Cci.PrimitiveTypeCode.UIntPtr:
                    if (@checked)
                    {
                        this.EmitOpCode(ILOpCode.Conv_ovf_i8_un);
                    }
                    else
                    {
                        this.EmitOpCode(ILOpCode.Conv_u8);         // 0 extend if unchecked
                    }
                    break;

                case StarkPlatform.Cci.PrimitiveTypeCode.UInt64:
                    if (@checked)
                    {
                        this.EmitOpCode(ILOpCode.Conv_ovf_i8_un);
                    }
                    break;         // NOP in unchecked

                default:
                    Debug.Assert(fromPredefTypeKind.IsFloatingPoint());
                    if (@checked)
                    {
                        this.EmitOpCode(ILOpCode.Conv_ovf_i8);
                    }
                    else
                    {
                        this.EmitOpCode(ILOpCode.Conv_i8);
                    }
                    break;
                }
                break;

            case StarkPlatform.Cci.PrimitiveTypeCode.UInt64:
                switch (fromPredefTypeKind)
                {
                case StarkPlatform.Cci.PrimitiveTypeCode.UInt64:
                    break;         //NOP

                case StarkPlatform.Cci.PrimitiveTypeCode.UInt8:
                case StarkPlatform.Cci.PrimitiveTypeCode.UInt16:
                case StarkPlatform.Cci.PrimitiveTypeCode.UInt32:
                case StarkPlatform.Cci.PrimitiveTypeCode.Pointer:
                case StarkPlatform.Cci.PrimitiveTypeCode.UIntPtr:
                case StarkPlatform.Cci.PrimitiveTypeCode.Rune:
                    this.EmitOpCode(ILOpCode.Conv_u8);         // 0 extend
                    break;

                case StarkPlatform.Cci.PrimitiveTypeCode.Int8:
                case StarkPlatform.Cci.PrimitiveTypeCode.Int16:
                case StarkPlatform.Cci.PrimitiveTypeCode.Int32:
                case StarkPlatform.Cci.PrimitiveTypeCode.IntPtr:
                    if (@checked)
                    {
                        this.EmitOpCode(ILOpCode.Conv_ovf_u8);
                    }
                    else
                    {
                        this.EmitOpCode(ILOpCode.Conv_i8);         // sign extend if unchecked
                    }
                    break;

                case StarkPlatform.Cci.PrimitiveTypeCode.Int64:
                    if (@checked)
                    {
                        this.EmitOpCode(ILOpCode.Conv_ovf_u8);
                    }
                    break;         // NOP in unchecked

                default:
                    Debug.Assert(fromPredefTypeKind.IsFloatingPoint());
                    if (@checked)
                    {
                        this.EmitOpCode(ILOpCode.Conv_ovf_u8);
                    }
                    else
                    {
                        this.EmitOpCode(ILOpCode.Conv_u8);
                    }
                    break;
                }
                break;

            case StarkPlatform.Cci.PrimitiveTypeCode.Float32:
                switch (fromPredefTypeKind)
                {
                case StarkPlatform.Cci.PrimitiveTypeCode.UInt32:
                case StarkPlatform.Cci.PrimitiveTypeCode.UInt64:
                    this.EmitOpCode(ILOpCode.Conv_r_un);
                    break;
                }
                this.EmitOpCode(ILOpCode.Conv_r4);
                break;

            case StarkPlatform.Cci.PrimitiveTypeCode.Float64:
                switch (fromPredefTypeKind)
                {
                case StarkPlatform.Cci.PrimitiveTypeCode.UInt32:
                case StarkPlatform.Cci.PrimitiveTypeCode.UInt64:
                    this.EmitOpCode(ILOpCode.Conv_r_un);
                    break;
                }
                this.EmitOpCode(ILOpCode.Conv_r8);
                break;

            case StarkPlatform.Cci.PrimitiveTypeCode.Pointer:
                if (@checked)
                {
                    switch (fromPredefTypeKind)
                    {
                    case StarkPlatform.Cci.PrimitiveTypeCode.UInt8:
                    case StarkPlatform.Cci.PrimitiveTypeCode.UInt16:
                    case StarkPlatform.Cci.PrimitiveTypeCode.UInt32:
                        this.EmitOpCode(ILOpCode.Conv_u);
                        break;

                    case StarkPlatform.Cci.PrimitiveTypeCode.UInt64:
                        this.EmitOpCode(ILOpCode.Conv_ovf_u_un);
                        break;

                    case StarkPlatform.Cci.PrimitiveTypeCode.Int8:
                    case StarkPlatform.Cci.PrimitiveTypeCode.Int16:
                    case StarkPlatform.Cci.PrimitiveTypeCode.Int32:
                    case StarkPlatform.Cci.PrimitiveTypeCode.Int64:
                        this.EmitOpCode(ILOpCode.Conv_ovf_u);
                        break;

                    default:
                        throw ExceptionUtilities.UnexpectedValue(fromPredefTypeKind);
                    }
                }
                else
                {
                    switch (fromPredefTypeKind)
                    {
                    case StarkPlatform.Cci.PrimitiveTypeCode.UInt8:
                    case StarkPlatform.Cci.PrimitiveTypeCode.UInt16:
                    case StarkPlatform.Cci.PrimitiveTypeCode.UInt32:
                    case StarkPlatform.Cci.PrimitiveTypeCode.UInt64:
                    case StarkPlatform.Cci.PrimitiveTypeCode.Int64:
                        this.EmitOpCode(ILOpCode.Conv_u);
                        break;

                    case StarkPlatform.Cci.PrimitiveTypeCode.Int8:
                    case StarkPlatform.Cci.PrimitiveTypeCode.Int16:
                    case StarkPlatform.Cci.PrimitiveTypeCode.Int32:
                        // This matches dev10.  Presumably, we're using conv_i,
                        // rather than conv_u, to sign-extend the value.
                        this.EmitOpCode(ILOpCode.Conv_i);
                        break;

                    default:
                        throw ExceptionUtilities.UnexpectedValue(fromPredefTypeKind);
                    }
                }
                break;

            default:
                throw ExceptionUtilities.UnexpectedValue(toPredefTypeKind);
            }
        }