-
- /// <summary>
- /// Converts the IntConstant, UIntConstant, LongConstant or
- /// ULongConstant into the integral target_type. Notice
- /// that we do not return an `Expression' we do return
- /// a boxed integral type.
- ///
- /// FIXME: Since I added the new constants, we need to
- /// also support conversions from CharConstant, ByteConstant,
- /// SByteConstant, UShortConstant, ShortConstant
- ///
- /// This is used by the switch statement, so the domain
- /// of work is restricted to the literals above, and the
- /// targets are int32, uint32, char, byte, sbyte, ushort,
- /// short, uint64 and int64
- /// </summary>
- public static object ConvertIntLiteral (Constant c, Type target_type, Location loc)
- {
- if (!Convert.ImplicitStandardConversionExists (Convert.ConstantEC, c, target_type)){
- Convert.Error_CannotImplicitConversion (loc, c.Type, target_type);
- return null;
- }
-
- string s = "";
-
- if (c.Type == target_type)
- return ((Constant) c).GetValue ();
-
- //
- // Make into one of the literals we handle, we dont really care
- // about this value as we will just return a few limited types
- //
- if (c is EnumConstant)
- c = ((EnumConstant)c).WidenToCompilerConstant ();
-
- if (c is IntConstant){
- int v = ((IntConstant) c).Value;
-
- if (target_type == TypeManager.uint32_type){
- if (v >= 0)
- return (uint) v;
- } else if (target_type == TypeManager.char_type){
- if (v >= Char.MinValue && v <= Char.MaxValue)
- return (char) v;
- } else if (target_type == TypeManager.byte_type){
- if (v >= Byte.MinValue && v <= Byte.MaxValue)
- return (byte) v;
- } else if (target_type == TypeManager.sbyte_type){
- if (v >= SByte.MinValue && v <= SByte.MaxValue)
- return (sbyte) v;
- } else if (target_type == TypeManager.short_type){
- if (v >= Int16.MinValue && v <= UInt16.MaxValue)
- return (short) v;
- } else if (target_type == TypeManager.ushort_type){
- if (v >= UInt16.MinValue && v <= UInt16.MaxValue)
- return (ushort) v;
- } else if (target_type == TypeManager.int64_type)
- return (long) v;
- else if (target_type == TypeManager.uint64_type){
- if (v > 0)
- return (ulong) v;
- }
-
- s = v.ToString ();
- } else if (c is UIntConstant){
- uint v = ((UIntConstant) c).Value;
-
- if (target_type == TypeManager.int32_type){
- if (v <= Int32.MaxValue)
- return (int) v;
- } else if (target_type == TypeManager.char_type){
- if (v >= Char.MinValue && v <= Char.MaxValue)
- return (char) v;
- } else if (target_type == TypeManager.byte_type){
- if (v <= Byte.MaxValue)
- return (byte) v;
- } else if (target_type == TypeManager.sbyte_type){
- if (v <= SByte.MaxValue)
- return (sbyte) v;
- } else if (target_type == TypeManager.short_type){
- if (v <= UInt16.MaxValue)
- return (short) v;
- } else if (target_type == TypeManager.ushort_type){
- if (v <= UInt16.MaxValue)
- return (ushort) v;
- } else if (target_type == TypeManager.int64_type)
- return (long) v;
- else if (target_type == TypeManager.uint64_type)
- return (ulong) v;
- s = v.ToString ();
- } else if (c is LongConstant){
- long v = ((LongConstant) c).Value;
-
- if (target_type == TypeManager.int32_type){
- if (v >= UInt32.MinValue && v <= UInt32.MaxValue)
- return (int) v;
- } else if (target_type == TypeManager.uint32_type){
- if (v >= 0 && v <= UInt32.MaxValue)
- return (uint) v;
- } else if (target_type == TypeManager.char_type){
- if (v >= Char.MinValue && v <= Char.MaxValue)
- return (char) v;
- } else if (target_type == TypeManager.byte_type){
- if (v >= Byte.MinValue && v <= Byte.MaxValue)
- return (byte) v;
- } else if (target_type == TypeManager.sbyte_type){
- if (v >= SByte.MinValue && v <= SByte.MaxValue)
- return (sbyte) v;
- } else if (target_type == TypeManager.short_type){
- if (v >= Int16.MinValue && v <= UInt16.MaxValue)
- return (short) v;
- } else if (target_type == TypeManager.ushort_type){
- if (v >= UInt16.MinValue && v <= UInt16.MaxValue)
- return (ushort) v;
- } else if (target_type == TypeManager.uint64_type){
- if (v > 0)
- return (ulong) v;
- }
- s = v.ToString ();
- } else if (c is ULongConstant){
- ulong v = ((ULongConstant) c).Value;
-
- if (target_type == TypeManager.int32_type){
- if (v <= Int32.MaxValue)
- return (int) v;
- } else if (target_type == TypeManager.uint32_type){
- if (v <= UInt32.MaxValue)
- return (uint) v;
- } else if (target_type == TypeManager.char_type){
- if (v >= Char.MinValue && v <= Char.MaxValue)
- return (char) v;
- } else if (target_type == TypeManager.byte_type){
- if (v >= Byte.MinValue && v <= Byte.MaxValue)
- return (byte) v;
- } else if (target_type == TypeManager.sbyte_type){
- if (v <= (int) SByte.MaxValue)
- return (sbyte) v;
- } else if (target_type == TypeManager.short_type){
- if (v <= UInt16.MaxValue)
- return (short) v;
- } else if (target_type == TypeManager.ushort_type){
- if (v <= UInt16.MaxValue)
- return (ushort) v;
- } else if (target_type == TypeManager.int64_type){
- if (v <= Int64.MaxValue)
- return (long) v;
- }
- s = v.ToString ();
- } else if (c is ByteConstant){
- byte v = ((ByteConstant) c).Value;
-
- if (target_type == TypeManager.int32_type)
- return (int) v;
- else if (target_type == TypeManager.uint32_type)
- return (uint) v;
- else if (target_type == TypeManager.char_type)
- return (char) v;
- else if (target_type == TypeManager.sbyte_type){
- if (v <= SByte.MaxValue)
- return (sbyte) v;
- } else if (target_type == TypeManager.short_type)
- return (short) v;
- else if (target_type == TypeManager.ushort_type)
- return (ushort) v;
- else if (target_type == TypeManager.int64_type)
- return (long) v;
- else if (target_type == TypeManager.uint64_type)
- return (ulong) v;
- s = v.ToString ();
- } else if (c is SByteConstant){
- sbyte v = ((SByteConstant) c).Value;
-
- if (target_type == TypeManager.int32_type)
- return (int) v;
- else if (target_type == TypeManager.uint32_type){
- if (v >= 0)
- return (uint) v;
- } else if (target_type == TypeManager.char_type){
- if (v >= 0)
- return (char) v;
- } else if (target_type == TypeManager.byte_type){
- if (v >= 0)
- return (byte) v;
- } else if (target_type == TypeManager.short_type)
- return (short) v;
- else if (target_type == TypeManager.ushort_type){
- if (v >= 0)
- return (ushort) v;
- } else if (target_type == TypeManager.int64_type)
- return (long) v;
- else if (target_type == TypeManager.uint64_type){
- if (v >= 0)
- return (ulong) v;
- }
- s = v.ToString ();
- } else if (c is ShortConstant){
- short v = ((ShortConstant) c).Value;
-
- if (target_type == TypeManager.int32_type){
- return (int) v;
- } else if (target_type == TypeManager.uint32_type){
- if (v >= 0)
- return (uint) v;
- } else if (target_type == TypeManager.char_type){
- if (v >= 0)
- return (char) v;
- } else if (target_type == TypeManager.byte_type){
- if (v >= Byte.MinValue && v <= Byte.MaxValue)
- return (byte) v;
- } else if (target_type == TypeManager.sbyte_type){
- if (v >= SByte.MinValue && v <= SByte.MaxValue)
- return (sbyte) v;
- } else if (target_type == TypeManager.ushort_type){
- if (v >= 0)
- return (ushort) v;
- } else if (target_type == TypeManager.int64_type)
- return (long) v;
- else if (target_type == TypeManager.uint64_type)
- return (ulong) v;
-
- s = v.ToString ();
- } else if (c is UShortConstant){
- ushort v = ((UShortConstant) c).Value;
-
- if (target_type == TypeManager.int32_type)
- return (int) v;
- else if (target_type == TypeManager.uint32_type)
- return (uint) v;
- else if (target_type == TypeManager.char_type){
- if (v >= Char.MinValue && v <= Char.MaxValue)
- return (char) v;
- } else if (target_type == TypeManager.byte_type){
- if (v >= Byte.MinValue && v <= Byte.MaxValue)
- return (byte) v;
- } else if (target_type == TypeManager.sbyte_type){
- if (v <= SByte.MaxValue)
- return (byte) v;
- } else if (target_type == TypeManager.short_type){
- if (v <= Int16.MaxValue)
- return (short) v;
- } else if (target_type == TypeManager.int64_type)
- return (long) v;
- else if (target_type == TypeManager.uint64_type)
- return (ulong) v;
-
- s = v.ToString ();
- } else if (c is CharConstant){
- char v = ((CharConstant) c).Value;
-
- if (target_type == TypeManager.int32_type)
- return (int) v;
- else if (target_type == TypeManager.uint32_type)
- return (uint) v;
- else if (target_type == TypeManager.byte_type){
- if (v >= Byte.MinValue && v <= Byte.MaxValue)
- return (byte) v;
- } else if (target_type == TypeManager.sbyte_type){
- if (v <= SByte.MaxValue)
- return (sbyte) v;
- } else if (target_type == TypeManager.short_type){
- if (v <= Int16.MaxValue)
- return (short) v;
- } else if (target_type == TypeManager.ushort_type)
- return (short) v;
- else if (target_type == TypeManager.int64_type)
- return (long) v;
- else if (target_type == TypeManager.uint64_type)
- return (ulong) v;
-
- s = v.ToString ();
- }
- Error_ConstantValueCannotBeConverted (loc, s, target_type);
- return null;
- }