public static SpecialType GetTypeFromMetadataName(StarkPlatform.Cci.PrimitiveTypeCode typeCode) { return(s_typeCodeToTypeIdMap[(int)typeCode]); }
/// <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))); }
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); } }