Mercurial > projects > ddmd
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