Mercurial > projects > ddmd
diff dmd/ArrayLiteralExp.d @ 123:9e39c7de8438
Make dmd test suite compile
author | korDen |
---|---|
date | Fri, 03 Sep 2010 20:46:58 +0400 |
parents | e28b18c23469 |
children | 60bb0fe4563e |
line wrap: on
line diff
--- a/dmd/ArrayLiteralExp.d Thu Sep 02 23:37:49 2010 +0100 +++ b/dmd/ArrayLiteralExp.d Fri Sep 03 20:46:58 2010 +0400 @@ -16,6 +16,7 @@ import dmd.HdrGenState; import dmd.backend.dt_t; import dmd.InlineScanState; +import dmd.GlobalExpressions; import dmd.Array; import dmd.ArrayTypes; import dmd.TOK; @@ -238,7 +239,56 @@ override Expression interpret(InterState istate) { - assert(false); + Expressions expsx = null; + +version (LOG) { + printf("ArrayLiteralExp.interpret() %.*s\n", toChars()); +} + if (elements) + { + foreach (size_t i, Expression e; elements) + { + Expression ex; + + ex = e.interpret(istate); + if (ex is EXP_CANT_INTERPRET) + { + delete expsx; + return EXP_CANT_INTERPRET; + } + + /* If any changes, do Copy On Write + */ + if (ex != e) + { + if (!expsx) + { + expsx = new Expressions(); + expsx.setDim(elements.dim); + for (size_t j = 0; j < elements.dim; j++) + { + expsx[j] = elements[j]; + } + } + expsx[i] = ex; + } + } + } + if (elements && expsx) + { + expandTuples(expsx); + if (expsx.dim != elements.dim) + { + delete expsx; + return EXP_CANT_INTERPRET; + } + + ArrayLiteralExp ae = new ArrayLiteralExp(loc, expsx); + ae.type = type; + + return ae; + } + return this; } override MATCH implicitConvTo(Type t)