Mercurial > projects > ddmd
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) |