2 // constant.cs: Constants.
5 // Miguel de Icaza (miguel@ximian.com)
7 // (C) 2001 Ximian, Inc.
11 namespace Mono
.CSharp
{
14 using System
.Reflection
.Emit
;
17 /// Base class for constants and literals.
19 public abstract class Constant
: Expression
{
21 /// This is different from ToString in that ToString
22 /// is supposed to be there for debugging purposes,
23 /// and is not guaranteed to be useful for anything else,
24 /// AsString() will provide something that can be used
25 /// for round-tripping C# code. Maybe it can be used
26 /// for IL assembly as well.
28 public abstract string AsString ();
30 override public string ToString ()
32 return this.GetType ().Name
+ " (" + AsString () + ")";
36 /// This is used to obtain the actual value of the literal
37 /// cast into an object.
39 public abstract object GetValue ();
42 /// Constants are always born in a fully resolved state
44 public override Expression
DoResolve (EmitContext ec
)
50 // The various ToXXXX conversion functions are used by the constant
51 // folding evaluator. A null value is returned if the conversion is
54 // Note: not all the patterns for catching `implicit_conv' are the same.
55 // some implicit conversions can never be performed between two types
56 // even if the conversion would be lossless (for example short to uint),
57 // but some conversions are explicitly permitted by the standard provided
58 // that there will be no loss of information (for example, int to uint).
60 public DoubleConstant
ToDouble (Location loc
)
62 DoubleConstant c
= ConvertToDouble ();
65 Convert
.Error_CannotWideningConversion (loc
, Type
, TypeManager
.double_type
);
70 public FloatConstant
ToFloat (Location loc
)
72 FloatConstant c
= ConvertToFloat ();
75 Convert
.Error_CannotWideningConversion (loc
, Type
, TypeManager
.float_type
);
80 public ULongConstant
ToULong (Location loc
)
82 ULongConstant c
= ConvertToULong ();
85 Convert
.Error_CannotWideningConversion (loc
, Type
, TypeManager
.uint64_type
);
90 public LongConstant
ToLong (Location loc
)
92 LongConstant c
= ConvertToLong ();
95 Convert
.Error_CannotWideningConversion (loc
, Type
, TypeManager
.int64_type
);
100 public UIntConstant
ToUInt (Location loc
)
102 UIntConstant c
= ConvertToUInt ();
105 Convert
.Error_CannotWideningConversion (loc
, Type
, TypeManager
.uint32_type
);
110 public IntConstant
ToInt (Location loc
)
112 IntConstant c
= ConvertToInt ();
115 Convert
.Error_CannotWideningConversion (loc
, Type
, TypeManager
.int32_type
);
120 public DecimalConstant
ToDecimal (Location loc
)
122 DecimalConstant c
= ConvertToDecimal ();
125 Convert
.Error_CannotConvertType (loc
, Type
, TypeManager
.decimal_type
);
130 public ShortConstant
ToShort (Location loc
)
132 ShortConstant c
= ConvertToShort ();
135 Convert
.Error_CannotConvertType (loc
, Type
, TypeManager
.short_type
);
140 public ByteConstant
ToByte (Location loc
)
142 ByteConstant c
= ConvertToByte ();
145 Convert
.Error_CannotConvertType (loc
, Type
, TypeManager
.byte_type
);
150 public BoolConstant
ToBoolean (Location loc
)
152 BoolConstant c
= ConvertToBoolean ();
155 Convert
.Error_CannotConvertType (loc
, Type
, TypeManager
.bool_type
);
160 public CharConstant
ToChar (Location loc
)
162 CharConstant c
= ConvertToChar ();
165 Convert
.Error_CannotConvertType (loc
, Type
, TypeManager
.char_type
);
170 public virtual CharConstant
ConvertToChar ()
175 public virtual BoolConstant
ConvertToBoolean ()
180 public virtual ByteConstant
ConvertToByte ()
185 public virtual ShortConstant
ConvertToShort ()
190 public virtual DecimalConstant
ConvertToDecimal ()
195 public virtual DoubleConstant
ConvertToDouble ()
200 public virtual FloatConstant
ConvertToFloat ()
205 public virtual ULongConstant
ConvertToULong ()
210 public virtual LongConstant
ConvertToLong ()
215 public virtual UIntConstant
ConvertToUInt ()
220 public virtual IntConstant
ConvertToInt ()
225 public abstract bool IsNegative
{
230 // Returns true iff 1) the stack type of this is one of Object,
231 // int32, int64 and 2) this == 0 or this == null.
233 public virtual bool IsZeroInteger
{
234 get { return false; }
238 public class BoolConstant
: Constant
{
239 public readonly bool Value
;
241 public BoolConstant (bool val
)
243 type
= TypeManager
.bool_type
;
244 eclass
= ExprClass
.Value
;
249 override public string AsString ()
251 return Value
? "true" : "false";
254 public override object GetValue ()
256 return (object) Value
;
260 public override void Emit (EmitContext ec
)
263 ec
.ig
.Emit (OpCodes
.Ldc_I4_1
);
265 ec
.ig
.Emit (OpCodes
.Ldc_I4_0
);
268 public override DecimalConstant
ConvertToDecimal ()
270 return Value
? new DecimalConstant (0) : new DecimalConstant (-1);
273 public override DoubleConstant
ConvertToDouble ()
275 return Value
? new DoubleConstant (0) : new DoubleConstant (-1);
278 public override FloatConstant
ConvertToFloat ()
280 return Value
? new FloatConstant (0) : new FloatConstant (-1);
283 public override LongConstant
ConvertToLong ()
285 return Value
? new LongConstant (0) : new LongConstant (-1);
288 public override IntConstant
ConvertToInt ()
290 return Value
? new IntConstant (0) : new IntConstant (-1);
293 public override ShortConstant
ConvertToShort ()
295 return Value
? new ShortConstant (0) : new ShortConstant (-1);
298 public override ByteConstant
ConvertToByte ()
300 return Value
? new ByteConstant (0) : new ByteConstant (255);
303 public override BoolConstant
ConvertToBoolean ()
308 public override bool IsNegative
{
314 public override bool IsZeroInteger
{
315 get { return Value == false; }
319 public class ByteConstant
: Constant
{
320 public readonly byte Value
;
322 public ByteConstant (byte v
)
324 type
= TypeManager
.byte_type
;
325 eclass
= ExprClass
.Value
;
329 public override void Emit (EmitContext ec
)
331 IntLiteral
.EmitInt (ec
.ig
, Value
);
334 public override string AsString ()
336 return Value
.ToString ();
339 public override object GetValue ()
344 public override DoubleConstant
ConvertToDouble ()
346 return new DoubleConstant (Value
);
349 public override FloatConstant
ConvertToFloat ()
351 return new FloatConstant (Value
);
354 public override LongConstant
ConvertToLong ()
356 return new LongConstant (Value
);
359 public override ShortConstant
ConvertToShort ()
361 return new ShortConstant (Value
);
364 public override ByteConstant
ConvertToByte ()
369 public override DecimalConstant
ConvertToDecimal ()
371 return new DecimalConstant (Value
);
374 public override IntConstant
ConvertToInt ()
376 return new IntConstant (Value
);
379 public override BoolConstant
ConvertToBoolean ()
381 return new BoolConstant (Value
!= 0);
384 public override bool IsNegative
{
390 public override bool IsZeroInteger
{
391 get { return Value == 0; }
395 public class CharConstant
: Constant
{
396 public readonly char Value
;
398 public CharConstant (char v
)
400 type
= TypeManager
.char_type
;
401 eclass
= ExprClass
.Value
;
405 public override void Emit (EmitContext ec
)
407 IntLiteral
.EmitInt (ec
.ig
, Value
);
410 static public string descape (char c
)
436 return c
.ToString ();
439 public override string AsString ()
441 return "\"" + descape (Value
) + "\"";
444 public override object GetValue ()
449 public override DoubleConstant
ConvertToDouble ()
451 return new DoubleConstant (Value
);
454 public override FloatConstant
ConvertToFloat ()
456 return new FloatConstant (Value
);
459 public override ULongConstant
ConvertToULong ()
461 return new ULongConstant (Value
);
464 public override LongConstant
ConvertToLong ()
466 return new LongConstant (Value
);
469 public override UIntConstant
ConvertToUInt ()
471 return new UIntConstant (Value
);
474 public override IntConstant
ConvertToInt ()
476 return new IntConstant (Value
);
479 public override bool IsNegative
{
485 public override bool IsZeroInteger
{
486 get { return Value == '\0'; }
490 public class SByteConstant
: Constant
{
491 public readonly sbyte Value
;
493 public SByteConstant (sbyte v
)
495 type
= TypeManager
.sbyte_type
;
496 eclass
= ExprClass
.Value
;
500 public override void Emit (EmitContext ec
)
502 IntLiteral
.EmitInt (ec
.ig
, Value
);
505 public override string AsString ()
507 return Value
.ToString ();
510 public override object GetValue ()
515 public override DoubleConstant
ConvertToDouble ()
517 return new DoubleConstant (Value
);
520 public override FloatConstant
ConvertToFloat ()
522 return new FloatConstant (Value
);
525 public override ULongConstant
ConvertToULong ()
528 return new ULongConstant ((ulong) Value
);
533 public override LongConstant
ConvertToLong ()
535 return new LongConstant (Value
);
538 public override UIntConstant
ConvertToUInt ()
543 public override IntConstant
ConvertToInt ()
545 return new IntConstant (Value
);
548 public override bool IsNegative
{
554 public override bool IsZeroInteger
{
555 get { return Value == 0; }
559 public class ShortConstant
: Constant
{
560 public readonly short Value
;
562 public ShortConstant (short v
)
564 type
= TypeManager
.short_type
;
565 eclass
= ExprClass
.Value
;
569 public override void Emit (EmitContext ec
)
571 IntLiteral
.EmitInt (ec
.ig
, Value
);
574 public override string AsString ()
576 return Value
.ToString ();
579 public override object GetValue ()
584 public override DoubleConstant
ConvertToDouble ()
586 return new DoubleConstant (Value
);
589 public override FloatConstant
ConvertToFloat ()
591 return new FloatConstant (Value
);
594 public override LongConstant
ConvertToLong ()
596 return new LongConstant (Value
);
599 public override ShortConstant
ConvertToShort ()
604 public override IntConstant
ConvertToInt ()
606 return new IntConstant (Value
);
609 public override DecimalConstant
ConvertToDecimal ()
611 return new DecimalConstant (Value
);
614 public override ByteConstant
ConvertToByte ()
619 val
= System
.Convert
.ToByte (Value
);
620 } catch (Exception ex
) {
624 return new ByteConstant (val
);
627 public override BoolConstant
ConvertToBoolean ()
629 return new BoolConstant (Value
!= 0);
632 public override bool IsZeroInteger
{
633 get { return Value == 0; }
636 public override bool IsNegative
{
643 public class UShortConstant
: Constant
{
644 public readonly ushort Value
;
646 public UShortConstant (ushort v
)
648 type
= TypeManager
.ushort_type
;
649 eclass
= ExprClass
.Value
;
653 public override void Emit (EmitContext ec
)
655 IntLiteral
.EmitInt (ec
.ig
, Value
);
658 public override string AsString ()
660 return Value
.ToString ();
663 public override object GetValue ()
668 public override DoubleConstant
ConvertToDouble ()
670 return new DoubleConstant (Value
);
673 public override FloatConstant
ConvertToFloat ()
675 return new FloatConstant (Value
);
678 public override ULongConstant
ConvertToULong ()
680 return new ULongConstant (Value
);
683 public override LongConstant
ConvertToLong ()
685 return new LongConstant (Value
);
688 public override UIntConstant
ConvertToUInt ()
690 return new UIntConstant (Value
);
693 public override IntConstant
ConvertToInt ()
695 return new IntConstant (Value
);
698 public override bool IsNegative
{
704 public override bool IsZeroInteger
{
705 get { return Value == 0; }
709 public class IntConstant
: Constant
{
710 public readonly int Value
;
712 public IntConstant (int v
)
714 type
= TypeManager
.int32_type
;
715 eclass
= ExprClass
.Value
;
719 static public void EmitInt (ILGenerator ig
, int i
)
723 ig
.Emit (OpCodes
.Ldc_I4_M1
);
727 ig
.Emit (OpCodes
.Ldc_I4_0
);
731 ig
.Emit (OpCodes
.Ldc_I4_1
);
735 ig
.Emit (OpCodes
.Ldc_I4_2
);
739 ig
.Emit (OpCodes
.Ldc_I4_3
);
743 ig
.Emit (OpCodes
.Ldc_I4_4
);
747 ig
.Emit (OpCodes
.Ldc_I4_5
);
751 ig
.Emit (OpCodes
.Ldc_I4_6
);
755 ig
.Emit (OpCodes
.Ldc_I4_7
);
759 ig
.Emit (OpCodes
.Ldc_I4_8
);
763 if (i
>= -128 && i
<= 127){
764 ig
.Emit (OpCodes
.Ldc_I4_S
, (sbyte) i
);
766 ig
.Emit (OpCodes
.Ldc_I4
, i
);
771 public override void Emit (EmitContext ec
)
773 EmitInt (ec
.ig
, Value
);
776 public override string AsString ()
778 return Value
.ToString ();
781 public override object GetValue ()
786 public override DecimalConstant
ConvertToDecimal()
788 return new DecimalConstant (Value
);
791 public override DoubleConstant
ConvertToDouble ()
793 return new DoubleConstant (Value
);
796 public override FloatConstant
ConvertToFloat ()
798 return new FloatConstant (Value
);
801 public override LongConstant
ConvertToLong ()
803 return new LongConstant (Value
);
806 public override IntConstant
ConvertToInt ()
811 public override ShortConstant
ConvertToShort ()
816 val
= System
.Convert
.ToInt16 (Value
);
817 } catch (Exception ex
) {
821 return new ShortConstant (val
);
824 public override ByteConstant
ConvertToByte ()
829 val
= System
.Convert
.ToByte (Value
);
830 } catch (Exception ex
) {
834 return new ByteConstant (val
);
837 public override BoolConstant
ConvertToBoolean ()
839 return new BoolConstant (Value
!= 0);
842 public override bool IsNegative
{
848 public override bool IsZeroInteger
{
849 get { return Value == 0; }
853 public class UIntConstant
: Constant
{
854 public readonly uint Value
;
856 public UIntConstant (uint v
)
858 type
= TypeManager
.uint32_type
;
859 eclass
= ExprClass
.Value
;
863 public override void Emit (EmitContext ec
)
865 IntLiteral
.EmitInt (ec
.ig
, unchecked ((int) Value
));
868 public override string AsString ()
870 return Value
.ToString ();
873 public override object GetValue ()
878 public override DoubleConstant
ConvertToDouble ()
880 return new DoubleConstant (Value
);
883 public override FloatConstant
ConvertToFloat ()
885 return new FloatConstant (Value
);
888 public override ULongConstant
ConvertToULong ()
890 return new ULongConstant (Value
);
893 public override LongConstant
ConvertToLong ()
895 return new LongConstant (Value
);
898 public override UIntConstant
ConvertToUInt ()
903 public override IntConstant
ConvertToInt ()
908 public override bool IsNegative
{
914 public override bool IsZeroInteger
{
915 get { return Value == 0; }
919 public class LongConstant
: Constant
{
920 public readonly long Value
;
922 public LongConstant (long v
)
924 type
= TypeManager
.int64_type
;
925 eclass
= ExprClass
.Value
;
929 public override void Emit (EmitContext ec
)
931 ILGenerator ig
= ec
.ig
;
933 EmitLong (ig
, Value
);
936 static public void EmitLong (ILGenerator ig
, long l
)
939 IntLiteral
.EmitInt (ig
, unchecked ((int) l
));
940 ig
.Emit (OpCodes
.Conv_U8
);
942 ig
.Emit (OpCodes
.Ldc_I8
, l
);
946 public override string AsString ()
948 return Value
.ToString ();
951 public override object GetValue ()
956 public override DoubleConstant
ConvertToDouble ()
958 return new DoubleConstant (Value
);
961 public override FloatConstant
ConvertToFloat ()
963 return new FloatConstant (Value
);
966 public override DecimalConstant
ConvertToDecimal()
968 return new DecimalConstant (Value
);
971 public override LongConstant
ConvertToLong ()
976 public override IntConstant
ConvertToInt ()
981 val
= System
.Convert
.ToInt32 (Value
);
982 } catch (Exception ex
) {
986 return new IntConstant (val
);
989 public override ShortConstant
ConvertToShort ()
994 val
= System
.Convert
.ToInt16 (Value
);
995 } catch (Exception ex
) {
999 return new ShortConstant (val
);
1002 public override ByteConstant
ConvertToByte ()
1007 val
= System
.Convert
.ToByte (Value
);
1008 } catch (Exception ex
) {
1012 return new ByteConstant (val
);
1015 public override BoolConstant
ConvertToBoolean ()
1017 return new BoolConstant (Value
!= 0);
1020 public override bool IsNegative
{
1026 public override bool IsZeroInteger
{
1027 get { return Value == 0; }
1031 public class ULongConstant
: Constant
{
1032 public readonly ulong Value
;
1034 public ULongConstant (ulong v
)
1036 type
= TypeManager
.uint64_type
;
1037 eclass
= ExprClass
.Value
;
1041 public override void Emit (EmitContext ec
)
1043 ILGenerator ig
= ec
.ig
;
1045 LongLiteral
.EmitLong (ig
, unchecked ((long) Value
));
1048 public override string AsString ()
1050 return Value
.ToString ();
1053 public override object GetValue ()
1058 public override DoubleConstant
ConvertToDouble ()
1060 return new DoubleConstant (Value
);
1063 public override FloatConstant
ConvertToFloat ()
1065 return new FloatConstant (Value
);
1068 public override ULongConstant
ConvertToULong ()
1073 public override LongConstant
ConvertToLong ()
1078 public override UIntConstant
ConvertToUInt ()
1083 public override IntConstant
ConvertToInt ()
1088 public override bool IsNegative
{
1094 public override bool IsZeroInteger
{
1095 get { return Value == 0; }
1099 public class FloatConstant
: Constant
{
1100 public readonly float Value
;
1102 public FloatConstant (float v
)
1104 type
= TypeManager
.float_type
;
1105 eclass
= ExprClass
.Value
;
1109 public override void Emit (EmitContext ec
)
1111 ec
.ig
.Emit (OpCodes
.Ldc_R4
, Value
);
1114 public override string AsString ()
1116 return Value
.ToString ();
1119 public override object GetValue ()
1124 public override DoubleConstant
ConvertToDouble ()
1126 return new DoubleConstant (Value
);
1129 public override FloatConstant
ConvertToFloat ()
1134 public override DecimalConstant
ConvertToDecimal ()
1136 return new DecimalConstant (new System
.Decimal (Value
));
1139 public override LongConstant
ConvertToLong ()
1144 val
= System
.Convert
.ToInt64 (System
.Math
.Round (Value
));
1145 } catch (Exception ex
) {
1149 return new LongConstant (val
);
1153 public override IntConstant
ConvertToInt ()
1158 val
= System
.Convert
.ToInt32 (System
.Math
.Round (Value
));
1159 } catch (Exception ex
) {
1163 return new IntConstant (val
);
1166 public override ShortConstant
ConvertToShort ()
1171 val
= System
.Convert
.ToInt16 (System
.Math
.Round (Value
));
1172 } catch (Exception ex
) {
1176 return new ShortConstant (val
);
1179 public override ByteConstant
ConvertToByte ()
1184 val
= System
.Convert
.ToByte (System
.Math
.Round (Value
));
1185 } catch (Exception ex
) {
1189 return new ByteConstant (val
);
1192 public override BoolConstant
ConvertToBoolean ()
1194 return new BoolConstant (Value
!= 0);
1197 public override bool IsNegative
{
1204 public class DoubleConstant
: Constant
{
1205 public readonly double Value
;
1207 public DoubleConstant (double v
)
1209 type
= TypeManager
.double_type
;
1210 eclass
= ExprClass
.Value
;
1214 public override void Emit (EmitContext ec
)
1216 ec
.ig
.Emit (OpCodes
.Ldc_R8
, Value
);
1219 public override string AsString ()
1221 return Value
.ToString ();
1224 public override object GetValue ()
1229 public override DoubleConstant
ConvertToDouble ()
1234 public override FloatConstant
ConvertToFloat ()
1239 val
= System
.Convert
.ToSingle (Value
);
1240 } catch (Exception ex
) {
1244 return new FloatConstant (val
);
1247 public override DecimalConstant
ConvertToDecimal ()
1249 return new DecimalConstant (new System
.Decimal (Value
));
1252 public override LongConstant
ConvertToLong ()
1257 val
= System
.Convert
.ToInt64 (System
.Math
.Round (Value
));
1258 } catch (Exception ex
) {
1262 return new LongConstant (val
);
1266 public override IntConstant
ConvertToInt ()
1271 val
= System
.Convert
.ToInt32 (System
.Math
.Round (Value
));
1272 } catch (Exception ex
) {
1276 return new IntConstant (val
);
1279 public override ShortConstant
ConvertToShort ()
1284 val
= System
.Convert
.ToInt16 (System
.Math
.Round (Value
));
1285 } catch (Exception ex
) {
1289 return new ShortConstant (val
);
1292 public override ByteConstant
ConvertToByte ()
1297 val
= System
.Convert
.ToByte (System
.Math
.Round (Value
));
1298 } catch (Exception ex
) {
1302 return new ByteConstant (val
);
1305 public override BoolConstant
ConvertToBoolean ()
1307 return new BoolConstant (Value
!= 0);
1310 public override bool IsNegative
{
1317 public class DecimalConstant
: Constant
{
1318 public readonly decimal Value
;
1320 public DecimalConstant (decimal d
)
1322 type
= TypeManager
.decimal_type
;
1323 eclass
= ExprClass
.Value
;
1327 override public string AsString ()
1329 return Value
.ToString ();
1332 public override object GetValue ()
1334 return (object) Value
;
1337 public override void Emit (EmitContext ec
)
1339 ILGenerator ig
= ec
.ig
;
1341 int [] words
= Decimal
.GetBits (Value
);
1342 int power
= (words
[3] >> 16) & 0xff;
1344 if (power
== 0 && Value
<= int.MaxValue
&& Value
>= int.MinValue
)
1346 IntConstant
.EmitInt (ig
, (int)Value
);
1347 ig
.Emit (OpCodes
.Newobj
, TypeManager
.void_decimal_ctor_int_arg
);
1353 // FIXME: we could optimize this, and call a better
1357 IntConstant
.EmitInt (ig
, words
[0]);
1358 IntConstant
.EmitInt (ig
, words
[1]);
1359 IntConstant
.EmitInt (ig
, words
[2]);
1362 IntConstant
.EmitInt (ig
, words
[3] >> 31);
1365 IntConstant
.EmitInt (ig
, power
);
1367 ig
.Emit (OpCodes
.Newobj
, TypeManager
.void_decimal_ctor_five_args
);
1370 public override DoubleConstant
ConvertToDouble ()
1375 val
= System
.Convert
.ToDouble (Value
);
1376 } catch (Exception ex
) {
1380 return new DoubleConstant (val
);
1383 public override FloatConstant
ConvertToFloat ()
1388 val
= System
.Convert
.ToSingle (Value
);
1389 } catch (Exception ex
) {
1393 return new FloatConstant (val
);
1396 public override DecimalConstant
ConvertToDecimal ()
1401 public override LongConstant
ConvertToLong ()
1406 val
= System
.Convert
.ToInt64 (Value
);
1407 } catch (Exception ex
) {
1411 return new LongConstant (val
);
1414 public override IntConstant
ConvertToInt ()
1419 val
= System
.Convert
.ToInt32 (Value
);
1420 } catch (Exception ex
) {
1424 return new IntConstant (val
);
1427 public override ShortConstant
ConvertToShort ()
1432 val
= System
.Convert
.ToInt16 (Value
);
1433 } catch (Exception ex
) {
1437 return new ShortConstant (val
);
1440 public override ByteConstant
ConvertToByte ()
1445 val
= System
.Convert
.ToByte (Value
);
1446 } catch (Exception ex
) {
1450 return new ByteConstant (val
);
1453 public override BoolConstant
ConvertToBoolean ()
1455 return new BoolConstant (Value
!= 0);
1458 public override bool IsNegative
{
1465 public class StringConstant
: Constant
{
1466 public readonly string Value
;
1468 public StringConstant (string s
)
1470 type
= TypeManager
.string_type
;
1471 eclass
= ExprClass
.Value
;
1475 // FIXME: Escape the string.
1476 override public string AsString ()
1478 return "\"" + Value
+ "\"";
1481 public override object GetValue ()
1486 public override void Emit (EmitContext ec
)
1489 ec
.ig
.Emit (OpCodes
.Ldnull
);
1491 ec
.ig
.Emit (OpCodes
.Ldstr
, Value
);
1494 public override bool IsNegative
{
1504 public class DateConstant
: Constant
{
1505 public readonly DateTime Value
;
1507 public DateConstant (DateTime s
)
1509 type
= TypeManager
.date_type
;
1510 eclass
= ExprClass
.Value
;
1514 override public string AsString ()
1516 return "#" + Value
.ToString() + "#";
1519 public override object GetValue ()
1524 public override void Emit (EmitContext ec
)
1526 ec
.ig
.Emit (OpCodes
.Ldc_I8
, Value
.Ticks
);
1527 ec
.ig
.Emit (OpCodes
.Newobj
, TypeManager
.void_datetime_ctor_ticks_arg
);
1531 public override bool IsNegative
{