Mercurial > projects > ddmd
view dmd/ExpStatement.d @ 0:10317f0c89a5
Initial commit
author | korDen |
---|---|
date | Sat, 24 Oct 2009 08:42:06 +0400 |
parents | |
children | 5c9b78899f5d |
line wrap: on
line source
module dmd.ExpStatement; import dmd.Loc; import dmd.Statement; import dmd.AssertExp; import dmd.Expression; import dmd.OutBuffer; import dmd.HdrGenState; import dmd.Scope; import dmd.InterState; import dmd.InlineCostState; import dmd.InlineDoState; import dmd.InlineScanState; import dmd.IRState; import dmd.BE; import dmd.TOK; import dmd.DeclarationStatement; import dmd.backend.Blockx; import dmd.backend.Util; class ExpStatement : Statement { Expression exp; this(Loc loc, Expression exp) { super(loc); this.exp = exp; } Statement syntaxCopy() { Expression e = exp ? exp.syntaxCopy() : null; ExpStatement es = new ExpStatement(loc, e); return es; } void toCBuffer(OutBuffer buf, HdrGenState* hgs) { if (exp) exp.toCBuffer(buf, hgs); buf.writeByte(';'); if (!hgs.FLinit.init) buf.writenl(); } Statement semantic(Scope sc) { if (exp) { //printf("ExpStatement::semantic() %s\n", exp->toChars()); exp = exp.semantic(sc); exp = resolveProperties(sc, exp); exp.checkSideEffect(0); exp = exp.optimize(0); if (exp.op == TOK.TOKdeclaration && !isDeclarationStatement()) { Statement s = new DeclarationStatement(loc, exp); return s; } //exp = exp.optimize(isDeclarationStatement() ? WANT.WANTvalue : 0); } return this; } Expression interpret(InterState* istate) { assert(false); } BE blockExit() { BE result = BE.BEfallthru; if (exp) { if (exp.op == TOK.TOKhalt) return BE.BEhalt; if (exp.op == TOK.TOKassert) { AssertExp a = cast(AssertExp)exp; if (a.e1.isBool(false)) // if it's an assert(0) return BE.BEhalt; } if (exp.canThrow()) result |= BE.BEthrow; } return result; } int inlineCost(InlineCostState* ics) { return exp ? exp.inlineCost(ics) : 0; } Expression doInline(InlineDoState ids) { version (LOG) { if (exp) printf("ExpStatement.doInline() '%s'\n", exp.toChars()); } return exp ? exp.doInline(ids) : null; } Statement inlineScan(InlineScanState* iss) { version (LOG) { printf("ExpStatement.inlineScan(%s)\n", toChars()); } if (exp) exp = exp.inlineScan(iss); return this; } void toIR(IRState* irs) { Blockx* blx = irs.blx; //printf("ExpStatement.toIR(), exp = %s\n", exp ? exp.toChars() : ""); incUsage(irs, loc); if (exp) block_appendexp(blx.curblock, exp.toElem(irs)); } }