changeset 141:7171e6ea651d

+ Expression.toElem + Expression.toDt + Expression.isBit + BoolExp.optimize
author Trass3r
date Tue, 14 Sep 2010 02:38:37 +0200
parents 31c086f76669
children 3685b521ed05
files dmd/BoolExp.d dmd/Expression.d
diffstat 2 files changed, 27 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/dmd/BoolExp.d	Tue Sep 14 01:54:48 2010 +0200
+++ b/dmd/BoolExp.d	Tue Sep 14 02:38:37 2010 +0200
@@ -24,7 +24,7 @@
 
 	override Expression semantic(Scope sc)
 	{
-		UnaExp.semantic(sc);
+		super.semantic(sc);
 		e1 = resolveProperties(sc, e1);
 		e1 = e1.checkToBoolean();
 		type = Type.tboolean;
@@ -33,7 +33,16 @@
 
 	override Expression optimize(int result)
 	{
-		assert(false);
+		Expression e;
+
+	    e1 = e1.optimize(result);
+	    if (e1.isConst() == 1)
+	    {
+	        e = Bool(type, e1);
+	    }
+	    else
+	        e = this;
+	    return e;
 	}
 
 	override Expression interpret(InterState istate)
--- a/dmd/Expression.d	Tue Sep 14 01:54:48 2010 +0200
+++ b/dmd/Expression.d	Tue Sep 14 02:38:37 2010 +0200
@@ -53,6 +53,7 @@
 import dmd.Complex;
 
 import dmd.backend.elem;
+import dmd.backend.Util;
 import dmd.backend.dt_t;
 
 import core.memory;
@@ -914,9 +915,12 @@
 		return false;
 	}
     
-    int isBit()
+	/********************************
+	 * Does this expression result in either a 1 or a 0?
+	 */
+	int isBit()
 	{
-		assert(false);
+		return false;
 	}
 
 	/********************************
@@ -960,7 +964,6 @@
 	/****************************************
 	 * Resolve __LINE__ and __FILE__ to loc.
 	 */
-
 	Expression resolveLoc(Loc loc, Scope sc)
 	{
 	    return this;
@@ -1064,12 +1067,21 @@
     // Back end
     elem* toElem(IRState* irs)
 	{
+		print();
 		assert(false);
+		return null;
 	}
     
     dt_t** toDt(dt_t** pdt)
 	{
-		assert(false);
+		debug
+		{
+			writef("Expression::toDt() %d\n", op);
+			dump(0);
+		}
+		error("non-constant expression %s", toChars());
+		pdt = dtnzeros(pdt, 1);
+		return pdt;
 	}
 }