# HG changeset patch
# User Trass3r
# Date 1283383769 -7200
# Node ID 6caaf0256da1c11c0e8468b343d69330b0d79957
# Parent e28b18c2346964cd0334bd7bb71e7b7d89a9afb0
+ interpretation of (non-assign) binary expressions
+ BinExp.isunsigned
+ EqualExp.isBit
diff -r e28b18c23469 -r 6caaf0256da1 ddmd.visualdproj
--- 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 @@
0
0
0
- 0
+ 1
0
0
0
diff -r e28b18c23469 -r 6caaf0256da1 dmd/AddExp.d
--- 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)
diff -r e28b18c23469 -r 6caaf0256da1 dmd/AndExp.d
--- 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)
diff -r e28b18c23469 -r 6caaf0256da1 dmd/BinExp.d
--- 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();
diff -r e28b18c23469 -r 6caaf0256da1 dmd/CmpExp.d
--- 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()
diff -r e28b18c23469 -r 6caaf0256da1 dmd/DivExp.d
--- 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)
diff -r e28b18c23469 -r 6caaf0256da1 dmd/EqualExp.d
--- 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()
diff -r e28b18c23469 -r 6caaf0256da1 dmd/IdentityExp.d
--- 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)
diff -r e28b18c23469 -r 6caaf0256da1 dmd/MinExp.d
--- 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)
diff -r e28b18c23469 -r 6caaf0256da1 dmd/ModExp.d
--- 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)
diff -r e28b18c23469 -r 6caaf0256da1 dmd/MulExp.d
--- 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)
diff -r e28b18c23469 -r 6caaf0256da1 dmd/OrExp.d
--- 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)
diff -r e28b18c23469 -r 6caaf0256da1 dmd/ShlExp.d
--- 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()
diff -r e28b18c23469 -r 6caaf0256da1 dmd/ShrExp.d
--- 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()
diff -r e28b18c23469 -r 6caaf0256da1 dmd/UshrExp.d
--- 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
diff -r e28b18c23469 -r 6caaf0256da1 dmd/XorExp.d
--- 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)