comparison dmd/ArrayLiteralExp.d @ 84:be2ab491772e

Expressions -> Vector!Expression
author Eldar Insafutdinov <e.insafutdinov@gmail.com>
date Mon, 30 Aug 2010 16:12:19 +0100
parents 2e2a5c3f943a
children 39648eb578f6
comparison
equal deleted inserted replaced
83:ee670dd808a8 84:be2ab491772e
13 import dmd.IRState; 13 import dmd.IRState;
14 import dmd.InlineDoState; 14 import dmd.InlineDoState;
15 import dmd.HdrGenState; 15 import dmd.HdrGenState;
16 import dmd.backend.dt_t; 16 import dmd.backend.dt_t;
17 import dmd.InlineScanState; 17 import dmd.InlineScanState;
18 import dmd.Array;
18 import dmd.ArrayTypes; 19 import dmd.ArrayTypes;
19 import dmd.TOK; 20 import dmd.TOK;
20 import dmd.IntegerExp; 21 import dmd.IntegerExp;
21 import dmd.TypeSArray; 22 import dmd.TypeSArray;
22 import dmd.TY; 23 import dmd.TY;
43 44
44 this(Loc loc, Expression e) 45 this(Loc loc, Expression e)
45 { 46 {
46 super(loc, TOK.TOKarrayliteral, ArrayLiteralExp.sizeof); 47 super(loc, TOK.TOKarrayliteral, ArrayLiteralExp.sizeof);
47 elements = new Expressions(); 48 elements = new Expressions();
48 elements.push(cast(void*)e); 49 elements.push(e);
49 } 50 }
50 51
51 override Expression syntaxCopy() 52 override Expression syntaxCopy()
52 { 53 {
53 return new ArrayLiteralExp(loc, arraySyntaxCopy(elements)); 54 return new ArrayLiteralExp(loc, arraySyntaxCopy(elements));
65 return this; 66 return this;
66 67
67 // Run semantic() on each element 68 // Run semantic() on each element
68 for (int i = 0; i < elements.dim; i++) 69 for (int i = 0; i < elements.dim; i++)
69 { 70 {
70 e = cast(Expression)elements.data[i]; 71 e = elements.data[i];
71 e = e.semantic(sc); 72 e = e.semantic(sc);
72 assert(e.type); 73 assert(e.type);
73 elements.data[i] = cast(void*)e; 74 elements[i] = e;
74 } 75 }
75 76
76 expandTuples(elements); 77 expandTuples(elements);
77 78
78 for (int i = 0; i < elements.dim; i++) 79 for (int i = 0; i < elements.dim; i++)
104 if (!committed && e.op == TOKstring) 105 if (!committed && e.op == TOKstring)
105 { 106 {
106 StringExp se = cast(StringExp)e; 107 StringExp se = cast(StringExp)e;
107 se.committed = 0; 108 se.committed = 0;
108 } 109 }
109 elements.data[i] = cast(void*)e; 110 elements.data[i] = e;
110 } 111 }
111 112
112 if (!t0) 113 if (!t0)
113 t0 = Type.tvoid; 114 t0 = Type.tvoid;
114 type = new TypeSArray(t0, new IntegerExp(elements.dim)); 115 type = new TypeSArray(t0, new IntegerExp(elements.dim));
128 size_t dim; 129 size_t dim;
129 130
130 //printf("ArrayLiteralExp.toElem() %s\n", toChars()); 131 //printf("ArrayLiteralExp.toElem() %s\n", toChars());
131 if (elements) 132 if (elements)
132 { 133 {
133 scope Expressions args = new Expressions(); 134 scope args = new Array(); // ddmd was Expressions
134 dim = elements.dim; 135 dim = elements.dim;
135 args.setDim(dim + 1); // +1 for number of args parameter 136 args.setDim(dim + 1); // +1 for number of args parameter
136 e = el_long(TYint, dim); 137 e = el_long(TYint, dim);
137 args.data[dim] = cast(void*)e; 138 args.data[dim] = cast(void*)e;
138 for (size_t i = 0; i < dim; i++) 139 for (size_t i = 0; i < dim; i++)
139 { 140 {
140 Expression el = cast(Expression)elements.data[i]; 141 auto el = elements[i];
141 elem* ep = el.toElem(irs); 142 elem* ep = el.toElem(irs);
142 143
143 if (tybasic(ep.Ety) == TYstruct || tybasic(ep.Ety) == TYarray) 144 if (tybasic(ep.Ety) == TYstruct || tybasic(ep.Ety) == TYarray)
144 { 145 {
145 ep = el_una(OPstrpar, TYstruct, ep); 146 ep = el_una(OPstrpar, TYstruct, ep);
228 229
229 override Expression optimize(int result) 230 override Expression optimize(int result)
230 { 231 {
231 if (elements) 232 if (elements)
232 { 233 {
233 for (size_t i = 0; i < elements.dim; i++) 234 foreach (ref Expression e; elements)
234 { 235 {
235 Expression e = cast(Expression)elements.data[i];
236
237 e = e.optimize(WANTvalue | (result & WANTinterpret)); 236 e = e.optimize(WANTvalue | (result & WANTinterpret));
238 elements.data[i] = cast(void*)e;
239 } 237 }
240 } 238 }
241 239
242 return this; 240 return this;
243 } 241 }
304 if (elements.dim != tsa.dim.toInteger()) 302 if (elements.dim != tsa.dim.toInteger())
305 goto L1; 303 goto L1;
306 } 304 }
307 305
308 e = cast(ArrayLiteralExp)copy(); 306 e = cast(ArrayLiteralExp)copy();
309 e.elements = cast(Expressions)elements.copy(); 307 e.elements = elements.copy();
310 for (int i = 0; i < elements.dim; i++) 308 foreach (size_t i, Expression ex; elements)
311 { 309 {
312 Expression ex = cast(Expression)elements.data[i]; 310 e.elements[i] = ex.castTo(sc, tb.nextOf());
313 ex = ex.castTo(sc, tb.nextOf());
314 e.elements.data[i] = cast(void*)ex;
315 } 311 }
316 e.type = t; 312 e.type = t;
317 return e; 313 return e;
318 } 314 }
319 if (tb.ty == Tpointer && typeb.ty == Tsarray) 315 if (tb.ty == Tpointer && typeb.ty == Tsarray)