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)