changeset 115:6caaf0256da1

+ interpretation of (non-assign) binary expressions + BinExp.isunsigned + EqualExp.isBit
author Trass3r
date Thu, 02 Sep 2010 01:29:29 +0200
parents e28b18c23469
children 352a5164f692
files ddmd.visualdproj dmd/AddExp.d dmd/AndExp.d dmd/BinExp.d dmd/CmpExp.d dmd/DivExp.d dmd/EqualExp.d dmd/IdentityExp.d dmd/MinExp.d dmd/ModExp.d dmd/MulExp.d dmd/OrExp.d dmd/ShlExp.d dmd/ShrExp.d dmd/UshrExp.d dmd/XorExp.d
diffstat 16 files changed, 85 insertions(+), 29 deletions(-) [+]
line wrap: on
line diff
--- a/ddmd.visualdproj	Wed Sep 01 18:21:58 2010 +0200
+++ b/ddmd.visualdproj	Thu Sep 02 01:29:29 2010 +0200
@@ -98,7 +98,7 @@
   <verbose>0</verbose>
   <vtls>0</vtls>
   <symdebug>0</symdebug>
-  <optimize>0</optimize>
+  <optimize>1</optimize>
   <cpu>0</cpu>
   <isX86_64>0</isX86_64>
   <isLinux>0</isLinux>
--- a/dmd/AddExp.d	Wed Sep 01 18:21:58 2010 +0200
+++ b/dmd/AddExp.d	Thu Sep 02 01:29:29 2010 +0200
@@ -114,7 +114,7 @@
 
 	override Expression interpret(InterState istate)
 	{
-		assert(false);
+		return interpretCommon(istate, &Add);
 	}
 
 	override void buildArrayIdent(OutBuffer buf, Expressions arguments)
--- a/dmd/AndExp.d	Wed Sep 01 18:21:58 2010 +0200
+++ b/dmd/AndExp.d	Thu Sep 02 01:29:29 2010 +0200
@@ -75,7 +75,7 @@
 
 	override Expression interpret(InterState istate)
 	{
-		assert(false);
+		return interpretCommon(istate, &And);
 	}
 
 	override void buildArrayIdent(OutBuffer buf, Expressions arguments)
--- a/dmd/BinExp.d	Wed Sep 01 18:21:58 2010 +0200
+++ b/dmd/BinExp.d	Thu Sep 02 01:29:29 2010 +0200
@@ -655,7 +655,7 @@
 
     bool isunsigned()
 	{
-		assert(false);
+		return e1.type.isunsigned() || e2.type.isunsigned();
 	}
 	
     void incompatibleTypes()
@@ -670,19 +670,75 @@
 		assert(false);
 	}
 
-    void scanForNestedRef(Scope *sc)
-	{
-		assert(false);
-	}
-	
-    Expression interpretCommon(InterState istate, Expression *(*fp)(Type *, Expression *, Expression *))
+    void scanForNestedRef(Scope sc)
 	{
 		assert(false);
 	}
 
-    Expression interpretCommon2(InterState istate, Expression *(*fp)(TOK, Type *, Expression *, Expression *))
+	Expression interpretCommon(InterState istate, Expression function(Type, Expression, Expression) fp)
+	{
+		   Expression e;
+			Expression e1;
+			Expression e2;
+
+version(LOG)
+{
+			writef("BinExp::interpretCommon() %s\n", toChars());
+}
+			e1 = this.e1.interpret(istate);
+			if (e1 == EXP_CANT_INTERPRET)
+				goto Lcant;
+			if (e1.isConst() != 1)
+				goto Lcant;
+
+			e2 = this.e2.interpret(istate);
+			if (e2 == EXP_CANT_INTERPRET)
+				goto Lcant;
+			if (e2.isConst() != 1)
+				goto Lcant;
+
+			e = fp(type, e1, e2);
+			return e;
+
+		Lcant:
+			return EXP_CANT_INTERPRET;
+	}
+
+	Expression interpretCommon2(InterState istate, Expression function(TOK, Type, Expression, Expression) fp)
 	{
-		assert(false);
+		   Expression e;
+			Expression e1;
+			Expression e2;
+
+version(LOG)
+{
+			writef("BinExp::interpretCommon2() %s\n", toChars());
+}
+			e1 = this.e1.interpret(istate);
+			if (e1 == EXP_CANT_INTERPRET)
+				goto Lcant;
+			if (e1.isConst() != 1 &&
+				e1.op != TOKnull &&
+				e1.op != TOKstring &&
+				e1.op != TOKarrayliteral &&
+				e1.op != TOKstructliteral)
+				goto Lcant;
+
+			e2 = this.e2.interpret(istate);
+			if (e2 == EXP_CANT_INTERPRET)
+				goto Lcant;
+			if (e2.isConst() != 1 &&
+				e2.op != TOKnull &&
+				e2.op != TOKstring &&
+				e2.op != TOKarrayliteral &&
+				e2.op != TOKstructliteral)
+				goto Lcant;
+
+			e = fp(op, type, e1, e2);
+			return e;
+
+		Lcant:
+			return EXP_CANT_INTERPRET;
 	}
 	
     Expression interpretAssignCommon(InterState istate, Expression (*fp)(Type, Expression, Expression), int post = 0)
@@ -1324,7 +1380,8 @@
 		}
 		return e;
 	}
-	
+
+	version(DMDV2)
     override bool canThrow()
 	{
 		return e1.canThrow() || e2.canThrow();
--- a/dmd/CmpExp.d	Wed Sep 01 18:21:58 2010 +0200
+++ b/dmd/CmpExp.d	Thu Sep 02 01:29:29 2010 +0200
@@ -141,7 +141,7 @@
 
 	override Expression interpret(InterState istate)
 	{
-		assert(false);
+		return interpretCommon2(istate, &Cmp);
 	}
 
 	override int isBit()
--- a/dmd/DivExp.d	Wed Sep 01 18:21:58 2010 +0200
+++ b/dmd/DivExp.d	Thu Sep 02 01:29:29 2010 +0200
@@ -108,7 +108,7 @@
 
 	override Expression interpret(InterState istate)
 	{
-		assert(false);
+		return interpretCommon(istate, &Div);
 	}
 
 	override void buildArrayIdent(OutBuffer buf, Expressions arguments)
--- a/dmd/EqualExp.d	Wed Sep 01 18:21:58 2010 +0200
+++ b/dmd/EqualExp.d	Thu Sep 02 01:29:29 2010 +0200
@@ -143,12 +143,12 @@
 
 	override Expression interpret(InterState istate)
 	{
-		assert(false);
+		return interpretCommon2(istate, &Equal);
 	}
 
-	override int isBit()
+	override bool isBit()
 	{
-		assert(false);
+		return true;
 	}
 
 	override bool isCommutative()
--- a/dmd/IdentityExp.d	Wed Sep 01 18:21:58 2010 +0200
+++ b/dmd/IdentityExp.d	Thu Sep 02 01:29:29 2010 +0200
@@ -72,7 +72,7 @@
 
 	override Expression interpret(InterState istate)
 	{
-		assert(false);
+		return interpretCommon2(istate, &Identity);
 	}
 
 	override elem* toElem(IRState* irs)
--- a/dmd/MinExp.d	Wed Sep 01 18:21:58 2010 +0200
+++ b/dmd/MinExp.d	Thu Sep 02 01:29:29 2010 +0200
@@ -140,7 +140,7 @@
 
 	override Expression interpret(InterState istate)
 	{
-		assert(false);
+		return interpretCommon(istate, &Min);
 	}
 
 	override void buildArrayIdent(OutBuffer buf, Expressions arguments)
--- a/dmd/ModExp.d	Wed Sep 01 18:21:58 2010 +0200
+++ b/dmd/ModExp.d	Thu Sep 02 01:29:29 2010 +0200
@@ -75,7 +75,7 @@
 
 	override Expression interpret(InterState istate)
 	{
-		assert(false);
+		return interpretCommon(istate, &Mod);
 	}
 
 	override void buildArrayIdent(OutBuffer buf, Expressions arguments)
--- a/dmd/MulExp.d	Wed Sep 01 18:21:58 2010 +0200
+++ b/dmd/MulExp.d	Thu Sep 02 01:29:29 2010 +0200
@@ -113,7 +113,7 @@
 
 	override Expression interpret(InterState istate)
 	{
-		assert(false);
+		return interpretCommon(istate, &Mul);
 	}
 
 	override void buildArrayIdent(OutBuffer buf, Expressions arguments)
--- a/dmd/OrExp.d	Wed Sep 01 18:21:58 2010 +0200
+++ b/dmd/OrExp.d	Thu Sep 02 01:29:29 2010 +0200
@@ -76,7 +76,7 @@
 
 	override Expression interpret(InterState istate)
 	{
-		assert(false);
+		return interpretCommon(istate, &Or);
 	}
 
 	override void buildArrayIdent(OutBuffer buf, Expressions arguments)
--- a/dmd/ShlExp.d	Wed Sep 01 18:21:58 2010 +0200
+++ b/dmd/ShlExp.d	Thu Sep 02 01:29:29 2010 +0200
@@ -57,7 +57,7 @@
 
 	override Expression interpret(InterState istate)
 	{
-		assert(false);
+		return interpretCommon(istate, &Shl);
 	}
 
 	override IntRange getIntRange()
--- a/dmd/ShrExp.d	Wed Sep 01 18:21:58 2010 +0200
+++ b/dmd/ShrExp.d	Thu Sep 02 01:29:29 2010 +0200
@@ -55,7 +55,7 @@
 
 	override Expression interpret(InterState istate)
 	{
-		assert(false);
+		return interpretCommon(istate, &Shr);
 	}
 
 	override IntRange getIntRange()
--- a/dmd/UshrExp.d	Wed Sep 01 18:21:58 2010 +0200
+++ b/dmd/UshrExp.d	Thu Sep 02 01:29:29 2010 +0200
@@ -55,7 +55,7 @@
 
 	override Expression interpret(InterState istate)
 	{
-		assert(false);
+		return interpretCommon(istate, &Ushr);
 	}
 
 	override IntRange getIntRange()
@@ -82,5 +82,4 @@
 		el_setLoc(e, loc);
 		return e;
 	}
-}
-
+}
\ No newline at end of file
--- a/dmd/XorExp.d	Wed Sep 01 18:21:58 2010 +0200
+++ b/dmd/XorExp.d	Thu Sep 02 01:29:29 2010 +0200
@@ -73,7 +73,7 @@
 
 	override Expression interpret(InterState istate)
 	{
-		assert(false);
+		return interpretCommon(istate, &Xor);
 	}
 
 	override void buildArrayIdent(OutBuffer buf, Expressions arguments)