ExprConstant
using System;
namespace Microsoft.CSharp.RuntimeBinder.Semantics
{
internal sealed class ExprConstant : ExprWithType
{
public Expr OptionalConstructorCall { get; set; }
public bool IsZero => Val.IsZero(base.Type.ConstValKind);
public ConstVal Val { get; }
public ulong UInt64Value => Val.UInt64Val;
public long Int64Value {
get {
FUNDTYPE fundamentalType = base.Type.FundamentalType;
ConstVal val;
if (fundamentalType == FUNDTYPE.FT_U4) {
val = Val;
return val.UInt32Val;
}
if ((uint)(fundamentalType - 7) <= 1) {
val = Val;
return val.Int64Val;
}
val = Val;
return val.Int32Val;
}
}
public override object Object {
get {
if (base.Type is NullType)
return null;
ConstVal val;
object obj;
switch (System.Type.GetTypeCode(base.Type.AssociatedSystemType)) {
case TypeCode.Boolean:
val = Val;
obj = val.BooleanVal;
break;
case TypeCode.SByte:
val = Val;
obj = val.SByteVal;
break;
case TypeCode.Byte:
val = Val;
obj = val.ByteVal;
break;
case TypeCode.Int16:
val = Val;
obj = val.Int16Val;
break;
case TypeCode.UInt16:
val = Val;
obj = val.UInt16Val;
break;
case TypeCode.Int32:
val = Val;
obj = val.Int32Val;
break;
case TypeCode.UInt32:
val = Val;
obj = val.UInt32Val;
break;
case TypeCode.Int64:
val = Val;
obj = val.Int64Val;
break;
case TypeCode.UInt64:
val = Val;
obj = val.UInt64Val;
break;
case TypeCode.Single:
val = Val;
obj = val.SingleVal;
break;
case TypeCode.Double:
val = Val;
obj = val.DoubleVal;
break;
case TypeCode.Decimal:
val = Val;
obj = val.DecimalVal;
break;
case TypeCode.Char:
val = Val;
obj = val.CharVal;
break;
case TypeCode.String:
val = Val;
obj = val.StringVal;
break;
default:
val = Val;
obj = val.ObjectVal;
break;
}
if (!base.Type.IsEnumType)
return obj;
return Enum.ToObject(base.Type.AssociatedSystemType, obj);
}
}
public ExprConstant(CType type, ConstVal value)
: base(ExpressionKind.Constant, type)
{
Val = value;
}
}
}