Mercurial > projects > ldc
diff dmd2/optimize.c @ 1577:e4f7b5d9c68a
DMD 2.032 Merge.
author | Robert Clipsham <robert@octarineparrot.com> |
---|---|
date | Tue, 08 Sep 2009 10:07:56 +0100 |
parents | 54b3c1394d62 |
children |
line wrap: on
line diff
--- a/dmd2/optimize.c Tue Aug 25 21:35:43 2009 +0200 +++ b/dmd2/optimize.c Tue Sep 08 10:07:56 2009 +0100 @@ -86,6 +86,8 @@ e = ei->syntaxCopy(); e = e->semantic(v->scope); e = e->implicitCastTo(v->scope, v->type); + // enabling this line causes test22 in test suite to fail + //ei->type = e->type; v->scope = NULL; v->inuse--; } @@ -426,11 +428,50 @@ return this; } +Expression *NewExp::optimize(int result) +{ + if (thisexp) + thisexp = thisexp->optimize(WANTvalue); + + // Optimize parameters + if (newargs) + { + for (size_t i = 0; i < newargs->dim; i++) + { Expression *e = (Expression *)newargs->data[i]; + + e = e->optimize(WANTvalue); + newargs->data[i] = (void *)e; + } + } + + if (arguments) + { + for (size_t i = 0; i < arguments->dim; i++) + { Expression *e = (Expression *)arguments->data[i]; + + e = e->optimize(WANTvalue); + arguments->data[i] = (void *)e; + } + } + return this; +} + Expression *CallExp::optimize(int result) { //printf("CallExp::optimize(result = %d) %s\n", result, toChars()); Expression *e = this; + // Optimize parameters + if (arguments) + { + for (size_t i = 0; i < arguments->dim; i++) + { Expression *e = (Expression *)arguments->data[i]; + + e = e->optimize(WANTvalue); + arguments->data[i] = (void *)e; + } + } + e1 = e1->optimize(result); if (e1->op == TOKvar) { @@ -792,7 +833,8 @@ e2 = e2->optimize(WANTvalue | (result & WANTinterpret)); e = this; - if (this->e1->isConst() && this->e2->isConst()) + if ((this->e1->isConst() && this->e2->isConst()) || + (this->e1->op == TOKnull && this->e2->op == TOKnull)) { e = Identity(op, type, this->e1, this->e2); }