annotate dmd/ArrayInitializer.d @ 56:51605de93870

TupleExp.optimize UnrolledLoopStatement.ctor UnrolledLoopStatement.semantic UnrolledLoopStatement.blockExit OrOrExp.checkSideEffect FuncExp.syntaxCopy FuncLiteralDeclaration.syntaxCopy WhileStatement.hasBreak StructInitializer.toExpression StructLiteralExp.ctor StructLiteralExp.optimize BinExp.commonSemanticAssign ModAssignExp.opId Argument.isLazyArray CommaExp.implicitConvTo CommaExp.castTo TypeClass.isBaseOf createTypeInfoArray TypeTuple.getTypeInfoDeclaration TypeInfoTupleDeclaration.ctor TypeNext.constConv XorExp.implicitConvTo TemplateParameter.isTemplateValueParameter
author korDen
date Sat, 21 Aug 2010 14:16:53 +0400
parents 10317f0c89a5
children 35afd9294854
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1 module dmd.ArrayInitializer;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3 import dmd.ArrayTypes;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4 import dmd.Type;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5 import dmd.TypeNext;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6 import dmd.Array;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
7 import dmd.Loc;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
8 import dmd.Initializer;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
9 import dmd.WANT;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
10 import dmd.Util;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
11 import dmd.TY;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
12 import dmd.TypeSArray;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
13 import dmd.IntegerExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
14 import dmd.Expression;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
15 import dmd.ArrayLiteralExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
16 import dmd.Scope;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
17 import dmd.ErrorExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
18 import dmd.OutBuffer;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
19 import dmd.HdrGenState;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
20
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
21 import dmd.backend.dt_t;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
22 import dmd.backend.Util;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
23 import dmd.codegen.Util;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
24 import dmd.backend.TYM;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
25 import dmd.backend.Symbol;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
26
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
27 class ArrayInitializer : Initializer
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
28 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
29 Expressions index; // indices
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
30 Initializers value; // of Initializer *'s
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
31 uint dim = 0; // length of array being initialized
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
32 Type type = null; // type that array will be used to initialize
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
33 int sem = 0; // !=0 if semantic() is run
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
34
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
35 this(Loc loc)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
36 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
37 super(loc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
38 index = new Expressions();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
39 value = new Initializers();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
40 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
41
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
42 Initializer syntaxCopy()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
43 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
44 //printf("ArrayInitializer.syntaxCopy()\n");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
45
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
46 ArrayInitializer ai = new ArrayInitializer(loc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
47
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
48 assert(index.dim == value.dim);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
49 ai.index.setDim(index.dim);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
50 ai.value.setDim(value.dim);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
51 for (int i = 0; i < ai.value.dim; i++)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
52 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
53 Expression e = cast(Expression)index.data[i];
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
54 if (e)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
55 e = e.syntaxCopy();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
56 ai.index.data[i] = cast(void*)e;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
57
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
58 Initializer init = cast(Initializer)value.data[i];
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
59 init = init.syntaxCopy();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
60 ai.value.data[i] = cast(void*)init;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
61 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
62 return ai;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
63 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
64
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
65 void addInit(Expression index, Initializer value)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
66 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
67 this.index.push(cast(void*)index);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
68 this.value.push(cast(void*)value);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
69 dim = 0;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
70 type = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
71 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
72
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
73 Initializer semantic(Scope sc, Type t)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
74 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
75 uint i;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
76 uint length;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
77
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
78 //printf("ArrayInitializer.semantic(%s)\n", t.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
79 if (sem) // if semantic() already run
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
80 return this;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
81
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
82 sem = 1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
83 type = t;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
84 t = t.toBasetype();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
85 switch (t.ty)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
86 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
87 case Tpointer:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
88 case Tsarray:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
89 case Tarray:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
90 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
91
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
92 default:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
93 error(loc, "cannot use array to initialize %s", type.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
94 return this;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
95 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
96
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
97 length = 0;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
98 for (i = 0; i < index.dim; i++)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
99 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
100 Expression idx;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
101 Initializer val;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
102
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
103 idx = cast(Expression)index.data[i];
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
104 if (idx)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
105 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
106 idx = idx.semantic(sc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
107 idx = idx.optimize(WANTvalue | WANTinterpret);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
108 index.data[i] = cast(void*)idx;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
109 length = cast(uint)idx.toInteger();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
110 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
111
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
112 val = cast(Initializer)value.data[i];
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
113 val = val.semantic(sc, t.nextOf());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
114 value.data[i] = cast(void*)val;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
115 length++;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
116 if (length == 0)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
117 error(loc, "array dimension overflow");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
118 if (length > dim)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
119 dim = length;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
120 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
121 uint amax = 0x80000000;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
122 if (cast(uint) (dim * t.nextOf().size()) >= amax)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
123 error(loc, "array dimension %u exceeds max of %ju", dim, amax / t.nextOf().size());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
124
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
125 return this;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
126 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
127
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
128 Type inferType(Scope sc)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
129 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
130 //printf("ArrayInitializer.inferType() %s\n", toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
131 type = Type.terror;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
132 for (size_t i = 0; i < value.dim; i++)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
133 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
134 if (index.data[i])
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
135 goto Lno;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
136 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
137
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
138 for (size_t i = 0; i < value.dim; i++)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
139 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
140 Initializer iz = cast(Initializer)value.data[i];
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
141 if (iz)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
142 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
143 Type t = iz.inferType(sc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
144 if (i == 0)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
145 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
146 t = new TypeSArray(t, new IntegerExp(value.dim));
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
147 t = t.semantic(loc, sc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
148 type = t;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
149 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
150 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
151 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
152 return type;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
153
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
154 Lno:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
155 error(loc, "cannot infer type from this array initializer");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
156 return Type.terror;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
157 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
158
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
159 /********************************
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
160 * If possible, convert array initializer to array literal.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
161 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
162 Expression toExpression()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
163 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
164 Expression e;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
165
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
166 //printf("ArrayInitializer.toExpression(), dim = %d\n", dim);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
167 //static int i; if (++i == 2) halt();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
168
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
169 size_t edim;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
170 Type t = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
171 if (type)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
172 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
173 t = type.toBasetype();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
174 switch (t.ty)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
175 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
176 case Tsarray:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
177 edim = cast(uint)(cast(TypeSArray)t).dim.toInteger();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
178 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
179
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
180 case Tpointer:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
181 case Tarray:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
182 edim = dim;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
183 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
184
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
185 default:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
186 assert(0);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
187 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
188 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
189 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
190 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
191 edim = value.dim;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
192 for (size_t i = 0, j = 0; i < value.dim; i++, j++)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
193 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
194 if (index.data[i])
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
195 j = cast(uint)(cast(Expression)index.data[i]).toInteger();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
196 if (j >= edim)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
197 edim = j + 1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
198 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
199 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
200
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
201 Expressions elements = new Expressions();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
202 elements.setDim(edim);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
203 for (size_t i = 0, j = 0; i < value.dim; i++, j++)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
204 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
205 if (index.data[i])
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
206 j = cast(uint)(cast(Expression)index.data[i]).toInteger();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
207 assert(j < edim);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
208 Initializer iz = cast(Initializer)value.data[i];
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
209 if (!iz)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
210 goto Lno;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
211 Expression ex = iz.toExpression();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
212 if (!ex)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
213 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
214 goto Lno;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
215 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
216 elements.data[j] = cast(void*)ex;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
217 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
218
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
219 /* Fill in any missing elements with the default initializer
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
220 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
221 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
222 Expression init = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
223 for (size_t i = 0; i < edim; i++)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
224 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
225 if (!elements.data[i])
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
226 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
227 if (!type)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
228 goto Lno;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
229 if (!init)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
230 init = (cast(TypeNext)t).next.defaultInit(Loc(0));
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
231 elements.data[i] = cast(void*)init;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
232 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
233 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
234
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
235 Expression e2 = new ArrayLiteralExp(loc, elements);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
236 e2.type = type;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
237 return e2;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
238 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
239
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
240 Lno:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
241 delete elements;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
242 error(loc, "array initializers as expressions are not allowed");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
243 return new ErrorExp();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
244 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
245
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
246 Initializer toAssocArrayInitializer()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
247 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
248 assert(false);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
249 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
250
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
251 void toCBuffer(OutBuffer buf, HdrGenState* hgs)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
252 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
253 assert(false);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
254 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
255
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
256 dt_t* toDt()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
257 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
258 //printf("ArrayInitializer.toDt('%s')\n", toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
259 Type tb = type.toBasetype();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
260 Type tn = tb.nextOf().toBasetype();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
261
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
262 scope Array dts = new Array();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
263 uint size;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
264 uint length;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
265 uint i;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
266 dt_t* dt;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
267 dt_t* d;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
268 dt_t** pdtend;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
269
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
270 //printf("\tdim = %d\n", dim);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
271 dts.setDim(dim);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
272 dts.zero();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
273
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
274 size = cast(uint)tn.size();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
275
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
276 length = 0;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
277 for (i = 0; i < index.dim; i++)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
278 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
279 Expression idx;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
280 Initializer val;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
281
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
282 idx = cast(Expression)index.data[i];
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
283 if (idx)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
284 length = cast(uint)idx.toInteger();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
285 //printf("\tindex[%d] = %p, length = %u, dim = %u\n", i, idx, length, dim);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
286
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
287 assert(length < dim);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
288 val = cast(Initializer)value.data[i];
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
289 dt = val.toDt();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
290 if (dts.data[length])
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
291 error(loc, "duplicate initializations for index %d", length);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
292 dts.data[length] = cast(void*)dt;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
293 length++;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
294 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
295
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
296 Expression edefault = tb.nextOf().defaultInit(Loc(0));
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
297
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
298 uint n = 1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
299 for (Type tbn = tn; tbn.ty == Tsarray; tbn = tbn.nextOf().toBasetype())
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
300 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
301 TypeSArray tsa = cast(TypeSArray)tbn;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
302 n *= tsa.dim.toInteger();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
303 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
304
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
305 d = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
306 pdtend = &d;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
307 for (i = 0; i < dim; i++)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
308 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
309 dt = cast(dt_t*)dts.data[i];
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
310 if (dt)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
311 pdtend = dtcat(pdtend, dt);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
312 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
313 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
314 for (int j = 0; j < n; j++)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
315 pdtend = edefault.toDt(pdtend);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
316 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
317 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
318 switch (tb.ty)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
319 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
320 case Tsarray:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
321 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
322 uint tadim;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
323 TypeSArray ta = cast(TypeSArray)tb;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
324
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
325 tadim = cast(uint)ta.dim.toInteger();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
326 if (dim < tadim)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
327 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
328 if (edefault.isBool(false))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
329 // pad out end of array
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
330 pdtend = dtnzeros(pdtend, size * (tadim - dim));
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
331 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
332 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
333 for (i = dim; i < tadim; i++)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
334 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
335 for (int j = 0; j < n; j++)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
336 pdtend = edefault.toDt(pdtend);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
337 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
338 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
339 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
340 else if (dim > tadim)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
341 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
342 debug writef("1: ");
56
51605de93870 TupleExp.optimize
korDen
parents: 0
diff changeset
343 assert(false);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
344 error(loc, "too many initializers, %d, for array[%d]", dim, tadim);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
345 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
346 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
347 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
348
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
349 case Tpointer:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
350 case Tarray:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
351 // Create symbol, and then refer to it
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
352 Symbol* s = static_sym();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
353 s.Sdt = d;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
354 outdata(s);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
355
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
356 d = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
357 if (tb.ty == Tarray)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
358 dtdword(&d, dim);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
359 dtxoff(&d, s, 0, TYnptr);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
360 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
361
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
362 default:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
363 assert(0);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
364 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
365 return d;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
366 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
367
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
368 dt_t* toDtBit() // for bit arrays
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
369 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
370 assert(false);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
371 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
372
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
373 ArrayInitializer isArrayInitializer() { return this; }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
374 }