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;
public NullLiteral ()
{
- Driver.counter1++;
eclass = ExprClass.Value;
}
public override Expression DoResolve (EmitContext ec)
{
- type = TypeManager.object_type;
+ type = TypeManager.null_type;
return this;
}
{
ec.ig.Emit (OpCodes.Ldnull);
}
+
+ public override bool IsNegative {
+ get {
+ return false;
+ }
+ }
+
+ public override bool IsZeroInteger {
+ get { return true; }
+ }
}
//
{
Null = new NullPointer ();
}
-
+
+ private NullPointer ()
+ {
+ type = TypeManager.object_type;
+ }
+
public override void Emit (EmitContext ec)
{
ILGenerator ig = ec.ig;
}
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)
{
}