2004-12-22 Sebastien Pouliot <sebastien@ximian.com>
[mono.git] / mcs / mcs / literal.cs
old mode 100755 (executable)
new mode 100644 (file)
index da9f467..a998bb2
@@ -22,8 +22,30 @@ using System;
 using System.Reflection;
 using System.Reflection.Emit;
 
+//
+// I put System.Null just so we do not have to special case it on 
+// TypeManager.CSharpName
+//
+namespace System {
+       //
+       // Represents the Null Type, just used as a placeholder for the type in NullLiteral
+       //
+       public class Null {
+       }
+}
+       
 namespace Mono.CSharp {
 
+       //
+       // The NullType just exists to compare type equality, and for
+       // expressions that might have the `null type'
+       //
+       public class NullType {
+       }
+
+       //
+       // The null Literal constant
+       //
        public class NullLiteral : Constant {
                public static readonly NullLiteral Null;
 
@@ -34,7 +56,6 @@ namespace Mono.CSharp {
                        
                public NullLiteral ()
                {
-                       Driver.counter1++;
                        eclass = ExprClass.Value;
                }
                
@@ -50,7 +71,7 @@ namespace Mono.CSharp {
 
                public override Expression DoResolve (EmitContext ec)
                {
-                       type = TypeManager.object_type;
+                       type = TypeManager.null_type;
                        return this;
                }
 
@@ -58,6 +79,16 @@ namespace Mono.CSharp {
                {
                        ec.ig.Emit (OpCodes.Ldnull);
                }
+               
+               public override bool IsNegative {
+                       get {
+                               return false;
+                       }
+               }
+
+               public override bool IsZeroInteger {
+                       get { return true; }
+               }
        }
 
        //
@@ -70,7 +101,12 @@ namespace Mono.CSharp {
                {
                        Null = new NullPointer ();
                }
-               
+
+               private NullPointer ()
+               {
+                       type = TypeManager.object_type;
+               }
+
                public override void Emit (EmitContext ec)
                {
                        ILGenerator ig = ec.ig;
@@ -105,6 +141,14 @@ namespace Mono.CSharp {
        }
 
        public class IntLiteral : IntConstant {
+               public static IntLiteral One, Zero;
+               
+               static IntLiteral ()
+               {
+                       Zero = new IntLiteral (0);
+                       One = new IntLiteral (1);
+               }
+               
                public IntLiteral (int l) : base (l)
                {
                }