# HG changeset patch # User Eldar Insafutdinov # Date 1283455154 -3600 # Node ID 46ef67271ef3975fde6d7654ba930e081ddd7cd3 # Parent 2e2113cf863ce6d03f93fbf62826343b20d29e19# Parent fe941d774f4a699bfce1f45361fa6244a63d1ecc merge diff -r 2e2113cf863c -r 46ef67271ef3 ddmd.visualdproj --- a/ddmd.visualdproj Thu Sep 02 20:17:57 2010 +0100 +++ b/ddmd.visualdproj Thu Sep 02 20:19:14 2010 +0100 @@ -98,7 +98,7 @@ 0 0 0 - 0 + 1 0 0 0 diff -r 2e2113cf863c -r 46ef67271ef3 dmd/AddAssignExp.d --- a/dmd/AddAssignExp.d Thu Sep 02 20:17:57 2010 +0100 +++ b/dmd/AddAssignExp.d Thu Sep 02 20:19:14 2010 +0100 @@ -1,6 +1,7 @@ module dmd.AddAssignExp; import dmd.common; +import dmd.expression.Add; import dmd.BinExp; import dmd.Loc; import dmd.Expression; @@ -142,7 +143,7 @@ override Expression interpret(InterState istate) { - assert(false); + return interpretAssignCommon(istate, &Add); } override void buildArrayIdent(OutBuffer buf, Expressions arguments) diff -r 2e2113cf863c -r 46ef67271ef3 dmd/AddExp.d --- a/dmd/AddExp.d Thu Sep 02 20:17:57 2010 +0100 +++ b/dmd/AddExp.d Thu Sep 02 20:19:14 2010 +0100 @@ -114,7 +114,7 @@ override Expression interpret(InterState istate) { - assert(false); + return interpretCommon(istate, &Add); } override void buildArrayIdent(OutBuffer buf, Expressions arguments) diff -r 2e2113cf863c -r 46ef67271ef3 dmd/AndAssignExp.d --- a/dmd/AndAssignExp.d Thu Sep 02 20:17:57 2010 +0100 +++ b/dmd/AndAssignExp.d Thu Sep 02 20:19:14 2010 +0100 @@ -1,6 +1,7 @@ module dmd.AndAssignExp; import dmd.common; +import dmd.expression.And; import dmd.BinExp; import dmd.Loc; import dmd.Expression; @@ -30,7 +31,7 @@ override Expression interpret(InterState istate) { - assert(false); + return interpretAssignCommon(istate, &And); } override void buildArrayIdent(OutBuffer buf, Expressions arguments) diff -r 2e2113cf863c -r 46ef67271ef3 dmd/AndExp.d --- a/dmd/AndExp.d Thu Sep 02 20:17:57 2010 +0100 +++ b/dmd/AndExp.d Thu Sep 02 20:19:14 2010 +0100 @@ -75,7 +75,7 @@ override Expression interpret(InterState istate) { - assert(false); + return interpretCommon(istate, &And); } override void buildArrayIdent(OutBuffer buf, Expressions arguments) diff -r 2e2113cf863c -r 46ef67271ef3 dmd/BinExp.d --- a/dmd/BinExp.d Thu Sep 02 20:17:57 2010 +0100 +++ b/dmd/BinExp.d Thu Sep 02 20:19:14 2010 +0100 @@ -655,7 +655,7 @@ bool isunsigned() { - assert(false); + return e1.type.isunsigned() || e2.type.isunsigned(); } void incompatibleTypes() @@ -670,25 +670,82 @@ 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 is EXP_CANT_INTERPRET) + goto Lcant; + if (e1.isConst() != 1) + goto Lcant; + + e2 = this.e2.interpret(istate); + if (e2 is 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 is 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 is 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) + Expression interpretAssignCommon(InterState istate, Expression function(Type, Expression, Expression) fp, int post = 0) { -version (LOG) { - printf("BinExp.interpretAssignCommon() %.*s\n", toChars()); +version (LOG) +{ + writef("BinExp.interpretAssignCommon() %.*s\n", toChars()); } Expression e = EXP_CANT_INTERPRET; Expression e1 = this.e1; @@ -1324,7 +1381,8 @@ } return e; } - + + version(DMDV2) override bool canThrow() { return e1.canThrow() || e2.canThrow(); diff -r 2e2113cf863c -r 46ef67271ef3 dmd/CatAssignExp.d --- a/dmd/CatAssignExp.d Thu Sep 02 20:17:57 2010 +0100 +++ b/dmd/CatAssignExp.d Thu Sep 02 20:19:14 2010 +0100 @@ -20,6 +20,7 @@ import dmd.backend.TYM; import dmd.backend.mTY; +import dmd.expression.Cat; import dmd.expression.Util; class CatAssignExp : BinExp @@ -84,7 +85,7 @@ override Expression interpret(InterState istate) { - assert(false); + return interpretAssignCommon(istate, &Cat); } override Identifier opId() /* For operator overloading */ diff -r 2e2113cf863c -r 46ef67271ef3 dmd/CmpExp.d --- a/dmd/CmpExp.d Thu Sep 02 20:17:57 2010 +0100 +++ b/dmd/CmpExp.d Thu Sep 02 20:19:14 2010 +0100 @@ -141,7 +141,7 @@ override Expression interpret(InterState istate) { - assert(false); + return interpretCommon2(istate, &Cmp); } override int isBit() diff -r 2e2113cf863c -r 46ef67271ef3 dmd/DivAssignExp.d --- a/dmd/DivAssignExp.d Thu Sep 02 20:17:57 2010 +0100 +++ b/dmd/DivAssignExp.d Thu Sep 02 20:19:14 2010 +0100 @@ -21,6 +21,7 @@ import dmd.backend.elem; import dmd.backend.OPER; import dmd.backend.Util; +import dmd.expression.Div; import dmd.expression.Util; class DivAssignExp : BinExp @@ -95,7 +96,7 @@ override Expression interpret(InterState istate) { - assert(false); + return interpretAssignCommon(istate, &Div); } override void buildArrayIdent(OutBuffer buf, Expressions arguments) diff -r 2e2113cf863c -r 46ef67271ef3 dmd/DivExp.d --- a/dmd/DivExp.d Thu Sep 02 20:17:57 2010 +0100 +++ b/dmd/DivExp.d Thu Sep 02 20:19:14 2010 +0100 @@ -108,7 +108,7 @@ override Expression interpret(InterState istate) { - assert(false); + return interpretCommon(istate, &Div); } override void buildArrayIdent(OutBuffer buf, Expressions arguments) diff -r 2e2113cf863c -r 46ef67271ef3 dmd/EqualExp.d --- a/dmd/EqualExp.d Thu Sep 02 20:17:57 2010 +0100 +++ b/dmd/EqualExp.d Thu Sep 02 20:19:14 2010 +0100 @@ -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 2e2113cf863c -r 46ef67271ef3 dmd/IdentityExp.d --- a/dmd/IdentityExp.d Thu Sep 02 20:17:57 2010 +0100 +++ b/dmd/IdentityExp.d Thu Sep 02 20:19:14 2010 +0100 @@ -72,7 +72,7 @@ override Expression interpret(InterState istate) { - assert(false); + return interpretCommon2(istate, &Identity); } override elem* toElem(IRState* irs) diff -r 2e2113cf863c -r 46ef67271ef3 dmd/MinAssignExp.d --- a/dmd/MinAssignExp.d Thu Sep 02 20:17:57 2010 +0100 +++ b/dmd/MinAssignExp.d Thu Sep 02 20:19:14 2010 +0100 @@ -1,6 +1,7 @@ module dmd.MinAssignExp; import dmd.common; +import dmd.expression.Min; import dmd.BinExp; import dmd.Loc; import dmd.Expression; @@ -70,7 +71,7 @@ override Expression interpret(InterState istate) { - assert(false); + return interpretAssignCommon(istate, &Min); } override void buildArrayIdent(OutBuffer buf, Expressions arguments) diff -r 2e2113cf863c -r 46ef67271ef3 dmd/MinExp.d --- a/dmd/MinExp.d Thu Sep 02 20:17:57 2010 +0100 +++ b/dmd/MinExp.d Thu Sep 02 20:19:14 2010 +0100 @@ -140,7 +140,7 @@ override Expression interpret(InterState istate) { - assert(false); + return interpretCommon(istate, &Min); } override void buildArrayIdent(OutBuffer buf, Expressions arguments) diff -r 2e2113cf863c -r 46ef67271ef3 dmd/ModAssignExp.d --- a/dmd/ModAssignExp.d Thu Sep 02 20:17:57 2010 +0100 +++ b/dmd/ModAssignExp.d Thu Sep 02 20:19:14 2010 +0100 @@ -1,6 +1,7 @@ module dmd.ModAssignExp; import dmd.common; +import dmd.expression.Mod; import dmd.BinExp; import dmd.Loc; import dmd.Expression; @@ -32,7 +33,7 @@ override Expression interpret(InterState istate) { - assert(false); + return interpretAssignCommon(istate, &Mod); } override void buildArrayIdent(OutBuffer buf, Expressions arguments) diff -r 2e2113cf863c -r 46ef67271ef3 dmd/ModExp.d --- a/dmd/ModExp.d Thu Sep 02 20:17:57 2010 +0100 +++ b/dmd/ModExp.d Thu Sep 02 20:19:14 2010 +0100 @@ -75,7 +75,7 @@ override Expression interpret(InterState istate) { - assert(false); + return interpretCommon(istate, &Mod); } override void buildArrayIdent(OutBuffer buf, Expressions arguments) diff -r 2e2113cf863c -r 46ef67271ef3 dmd/MulAssignExp.d --- a/dmd/MulAssignExp.d Thu Sep 02 20:17:57 2010 +0100 +++ b/dmd/MulAssignExp.d Thu Sep 02 20:19:14 2010 +0100 @@ -17,6 +17,7 @@ import dmd.backend.elem; import dmd.backend.OPER; +import dmd.expression.Mul; import dmd.expression.Util; class MulAssignExp : BinExp @@ -87,7 +88,7 @@ override Expression interpret(InterState istate) { - assert(false); + return interpretAssignCommon(istate, &Mul); } override void buildArrayIdent(OutBuffer buf, Expressions arguments) diff -r 2e2113cf863c -r 46ef67271ef3 dmd/MulExp.d --- a/dmd/MulExp.d Thu Sep 02 20:17:57 2010 +0100 +++ b/dmd/MulExp.d Thu Sep 02 20:19:14 2010 +0100 @@ -113,7 +113,7 @@ override Expression interpret(InterState istate) { - assert(false); + return interpretCommon(istate, &Mul); } override void buildArrayIdent(OutBuffer buf, Expressions arguments) diff -r 2e2113cf863c -r 46ef67271ef3 dmd/OrAssignExp.d --- a/dmd/OrAssignExp.d Thu Sep 02 20:17:57 2010 +0100 +++ b/dmd/OrAssignExp.d Thu Sep 02 20:19:14 2010 +0100 @@ -1,6 +1,7 @@ module dmd.OrAssignExp; import dmd.common; +import dmd.expression.Or; import dmd.BinExp; import dmd.Loc; import dmd.Expression; @@ -30,7 +31,7 @@ override Expression interpret(InterState istate) { - assert(false); + return interpretAssignCommon(istate, &Or); } override void buildArrayIdent(OutBuffer buf, Expressions arguments) diff -r 2e2113cf863c -r 46ef67271ef3 dmd/OrExp.d --- a/dmd/OrExp.d Thu Sep 02 20:17:57 2010 +0100 +++ b/dmd/OrExp.d Thu Sep 02 20:19:14 2010 +0100 @@ -76,7 +76,7 @@ override Expression interpret(InterState istate) { - assert(false); + return interpretCommon(istate, &Or); } override void buildArrayIdent(OutBuffer buf, Expressions arguments) diff -r 2e2113cf863c -r 46ef67271ef3 dmd/PragmaDeclaration.d --- a/dmd/PragmaDeclaration.d Thu Sep 02 20:17:57 2010 +0100 +++ b/dmd/PragmaDeclaration.d Thu Sep 02 20:19:14 2010 +0100 @@ -61,7 +61,7 @@ if (e.op == TOKstring) { auto se = cast(StringExp)e; - writef("%s", se.toChars()[1..$-3] /*se.len, cast(char*)se.string_*/); + writef("%s", se.toChars()[1..$-2] /*se.len, cast(char*)se.string_*/); } else writef(e.toChars()); diff -r 2e2113cf863c -r 46ef67271ef3 dmd/ShlAssignExp.d --- a/dmd/ShlAssignExp.d Thu Sep 02 20:17:57 2010 +0100 +++ b/dmd/ShlAssignExp.d Thu Sep 02 20:19:14 2010 +0100 @@ -13,6 +13,7 @@ import dmd.Type; import dmd.backend.elem; import dmd.backend.OPER; +import dmd.expression.Shl; import dmd.expression.Util; class ShlAssignExp : BinExp @@ -47,7 +48,7 @@ override Expression interpret(InterState istate) { - assert(false); + return interpretAssignCommon(istate, &Shl); } override Identifier opId() /* For operator overloading */ diff -r 2e2113cf863c -r 46ef67271ef3 dmd/ShlExp.d --- a/dmd/ShlExp.d Thu Sep 02 20:17:57 2010 +0100 +++ b/dmd/ShlExp.d Thu Sep 02 20:19:14 2010 +0100 @@ -57,7 +57,7 @@ override Expression interpret(InterState istate) { - assert(false); + return interpretCommon(istate, &Shl); } override IntRange getIntRange() diff -r 2e2113cf863c -r 46ef67271ef3 dmd/ShrAssignExp.d --- a/dmd/ShrAssignExp.d Thu Sep 02 20:17:57 2010 +0100 +++ b/dmd/ShrAssignExp.d Thu Sep 02 20:19:14 2010 +0100 @@ -15,6 +15,7 @@ import dmd.backend.elem; import dmd.backend.OPER; +import dmd.expression.Shr; import dmd.expression.Util; class ShrAssignExp : BinExp @@ -49,7 +50,7 @@ override Expression interpret(InterState istate) { - assert(false); + return interpretAssignCommon(istate, &Shr); } override Identifier opId() /* For operator overloading */ diff -r 2e2113cf863c -r 46ef67271ef3 dmd/ShrExp.d --- a/dmd/ShrExp.d Thu Sep 02 20:17:57 2010 +0100 +++ b/dmd/ShrExp.d Thu Sep 02 20:19:14 2010 +0100 @@ -55,7 +55,7 @@ override Expression interpret(InterState istate) { - assert(false); + return interpretCommon(istate, &Shr); } override IntRange getIntRange() diff -r 2e2113cf863c -r 46ef67271ef3 dmd/UshrAssignExp.d --- a/dmd/UshrAssignExp.d Thu Sep 02 20:17:57 2010 +0100 +++ b/dmd/UshrAssignExp.d Thu Sep 02 20:19:14 2010 +0100 @@ -12,6 +12,7 @@ import dmd.TOK; import dmd.Type; import dmd.backend.elem; +import dmd.expression.Ushr; import dmd.expression.Util; class UshrAssignExp : BinExp @@ -45,7 +46,7 @@ override Expression interpret(InterState istate) { - assert(false); + return interpretAssignCommon(istate, &Ushr); } override Identifier opId() /* For operator overloading */ diff -r 2e2113cf863c -r 46ef67271ef3 dmd/UshrExp.d --- a/dmd/UshrExp.d Thu Sep 02 20:17:57 2010 +0100 +++ b/dmd/UshrExp.d Thu Sep 02 20:19:14 2010 +0100 @@ -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 2e2113cf863c -r 46ef67271ef3 dmd/XorAssignExp.d --- a/dmd/XorAssignExp.d Thu Sep 02 20:17:57 2010 +0100 +++ b/dmd/XorAssignExp.d Thu Sep 02 20:19:14 2010 +0100 @@ -1,6 +1,7 @@ module dmd.XorAssignExp; import dmd.common; +import dmd.expression.Xor; import dmd.BinExp; import dmd.Loc; import dmd.Expression; @@ -29,7 +30,7 @@ override Expression interpret(InterState istate) { - assert(false); + return interpretAssignCommon(istate, &Xor); } override void buildArrayIdent(OutBuffer buf, Expressions arguments) diff -r 2e2113cf863c -r 46ef67271ef3 dmd/XorExp.d --- a/dmd/XorExp.d Thu Sep 02 20:17:57 2010 +0100 +++ b/dmd/XorExp.d Thu Sep 02 20:19:14 2010 +0100 @@ -73,7 +73,7 @@ override Expression interpret(InterState istate) { - assert(false); + return interpretCommon(istate, &Xor); } override void buildArrayIdent(OutBuffer buf, Expressions arguments)