annotate dmd/ArrayInitializer.d @ 178:e3afd1303184

Many small bugs fixed Made all classes derive from TObject to detect memory leaks (functionality is disabled for now) Began work on overriding backend memory allocations (to avoid memory leaks)
author korDen
date Sun, 17 Oct 2010 07:42:00 +0400
parents 0c8cc2a10f99
children b0d41ff5e0df
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
114
e28b18c23469 added a module dmd.common for commonly used stuff
Trass3r
parents: 90
diff changeset
3 import dmd.common;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4 import dmd.ArrayTypes;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5 import dmd.Type;
79
43073c7c7769 updated to 2.035
Trass3r
parents: 73
diff changeset
6 import dmd.TypeAArray;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
7 import dmd.TypeNext;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
8 import dmd.Array;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
9 import dmd.Loc;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
10 import dmd.Initializer;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
11 import dmd.WANT;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
12 import dmd.Util;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
13 import dmd.TY;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
14 import dmd.TypeSArray;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
15 import dmd.IntegerExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
16 import dmd.Expression;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
17 import dmd.ArrayLiteralExp;
156
0c8cc2a10f99 + ArrayInitializer.toAssocArrayLiteral()
trass3r
parents: 130
diff changeset
18 import dmd.AssocArrayLiteralExp;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
19 import dmd.Scope;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
20 import dmd.ErrorExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
21 import dmd.OutBuffer;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
22 import dmd.HdrGenState;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
23
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
24 import dmd.backend.dt_t;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
25 import dmd.backend.Util;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
26 import dmd.codegen.Util;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
27 import dmd.backend.TYM;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
28 import dmd.backend.Symbol;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
29
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
30 class ArrayInitializer : Initializer
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
31 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
32 Expressions index; // indices
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
33 Initializers value; // of Initializer *'s
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
34 uint dim = 0; // length of array being initialized
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
35 Type type = null; // type that array will be used to initialize
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
36 int sem = 0; // !=0 if semantic() is run
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
37
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
38 this(Loc loc)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
39 {
178
e3afd1303184 Many small bugs fixed
korDen
parents: 156
diff changeset
40 register();
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
41 super(loc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
42 index = new Expressions();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
43 value = new Initializers();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
44 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
45
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 59
diff changeset
46 override Initializer syntaxCopy()
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
47 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
48 //printf("ArrayInitializer.syntaxCopy()\n");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
49
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
50 ArrayInitializer ai = new ArrayInitializer(loc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
51
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
52 assert(index.dim == value.dim);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
53 ai.index.setDim(index.dim);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
54 ai.value.setDim(value.dim);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
55 for (int i = 0; i < ai.value.dim; i++)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
56 {
84
be2ab491772e Expressions -> Vector!Expression
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 79
diff changeset
57 Expression e = index[i];
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
58 if (e)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
59 e = e.syntaxCopy();
84
be2ab491772e Expressions -> Vector!Expression
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 79
diff changeset
60 ai.index[i] = e;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
61
127
9ee9b55452cb Identifiers, Initializers -> Vector
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
62 auto init = value[i];
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
63 init = init.syntaxCopy();
127
9ee9b55452cb Identifiers, Initializers -> Vector
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
64 ai.value[i] = init;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
65 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
66 return ai;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
67 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
68
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
69 void addInit(Expression index, Initializer value)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
70 {
84
be2ab491772e Expressions -> Vector!Expression
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 79
diff changeset
71 this.index.push(index);
127
9ee9b55452cb Identifiers, Initializers -> Vector
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
72 this.value.push(value);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
73 dim = 0;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
74 type = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
75 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
76
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 59
diff changeset
77 override Initializer semantic(Scope sc, Type t)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
78 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
79 uint length;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
80
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
81 //printf("ArrayInitializer.semantic(%s)\n", t.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
82 if (sem) // if semantic() already run
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
83 return this;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
84
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
85 sem = 1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
86 type = t;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
87 t = t.toBasetype();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
88 switch (t.ty)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
89 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
90 case Tpointer:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
91 case Tsarray:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
92 case Tarray:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
93 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
94
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
95 default:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
96 error(loc, "cannot use array to initialize %s", type.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
97 return this;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
98 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
99
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
100 length = 0;
84
be2ab491772e Expressions -> Vector!Expression
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 79
diff changeset
101 foreach (size_t i, Expression idx; index)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
102 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
103 if (idx)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
104 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
105 idx = idx.semantic(sc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
106 idx = idx.optimize(WANTvalue | WANTinterpret);
84
be2ab491772e Expressions -> Vector!Expression
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 79
diff changeset
107 index[i] = idx;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
108 length = cast(uint)idx.toInteger();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
109 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
110
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
111 Initializer val = value[i];
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
112 val = val.semantic(sc, t.nextOf());
127
9ee9b55452cb Identifiers, Initializers -> Vector
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
113 value[i] = val;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
114 length++;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
115 if (length == 0)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
116 error(loc, "array dimension overflow");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
117 if (length > dim)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
118 dim = length;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
119 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
120 uint amax = 0x80000000;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
121 if (cast(uint) (dim * t.nextOf().size()) >= amax)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
122 error(loc, "array dimension %u exceeds max of %ju", dim, amax / t.nextOf().size());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
123
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
124 return this;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
125 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
126
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
127 int isAssociativeArray()
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
128 {
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
129 for (size_t i = 0; i < value.dim; i++)
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
130 {
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
131 if (index[i])
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
132 return 1;
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
133 }
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
134 return 0;
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
135 }
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
136
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 59
diff changeset
137 override Type inferType(Scope sc)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
138 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
139 //printf("ArrayInitializer.inferType() %s\n", toChars());
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
140 assert(0);
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
141 return null;
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
142 static if (false) {
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
143 type = Type.terror;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
144 for (size_t i = 0; i < value.dim; i++)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
145 {
90
39648eb578f6 more Expressions work
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 84
diff changeset
146 if (index[i])
79
43073c7c7769 updated to 2.035
Trass3r
parents: 73
diff changeset
147 goto Laa;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
148 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
149
127
9ee9b55452cb Identifiers, Initializers -> Vector
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
150 foreach (size_t i, Initializer iz; value)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
151 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
152 if (iz)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
153 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
154 Type t = iz.inferType(sc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
155 if (i == 0)
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
156 { /* BUG: This gets the type from the first element.
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
157 * Fix to use all the elements to figure out the type.
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
158 */
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
159 t = new TypeSArray(t, new IntegerExp(value.dim));
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
160 t = t.semantic(loc, sc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
161 type = t;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
162 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
163 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
164 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
165 return type;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
166
79
43073c7c7769 updated to 2.035
Trass3r
parents: 73
diff changeset
167 Laa:
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
168 /* It's possibly an associative array initializer.
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
169 * BUG: inferring type from first member.
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
170 */
127
9ee9b55452cb Identifiers, Initializers -> Vector
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
171 Initializer iz = value[0];
90
39648eb578f6 more Expressions work
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 84
diff changeset
172 Expression indexinit = index[0];
79
43073c7c7769 updated to 2.035
Trass3r
parents: 73
diff changeset
173 if (iz && indexinit)
43073c7c7769 updated to 2.035
Trass3r
parents: 73
diff changeset
174 {
43073c7c7769 updated to 2.035
Trass3r
parents: 73
diff changeset
175 Type t = iz.inferType(sc);
43073c7c7769 updated to 2.035
Trass3r
parents: 73
diff changeset
176 indexinit = indexinit.semantic(sc);
43073c7c7769 updated to 2.035
Trass3r
parents: 73
diff changeset
177 Type indext = indexinit.type;
43073c7c7769 updated to 2.035
Trass3r
parents: 73
diff changeset
178 t = new TypeAArray(t, indext);
43073c7c7769 updated to 2.035
Trass3r
parents: 73
diff changeset
179 type = t.semantic(loc, sc);
43073c7c7769 updated to 2.035
Trass3r
parents: 73
diff changeset
180 }
43073c7c7769 updated to 2.035
Trass3r
parents: 73
diff changeset
181 else
43073c7c7769 updated to 2.035
Trass3r
parents: 73
diff changeset
182 error(loc, "cannot infer type from this array initializer");
43073c7c7769 updated to 2.035
Trass3r
parents: 73
diff changeset
183 return type;
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
184 }
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
185 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
186
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
187 /********************************
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
188 * If possible, convert array initializer to array literal.
73
ef02e2e203c2 Updating to dmd2.033
korDen
parents: 72
diff changeset
189 * Otherwise return null.
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
190 */
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 59
diff changeset
191 override Expression toExpression()
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
192 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
193 Expression e;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
194
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
195 //printf("ArrayInitializer.toExpression(), dim = %d\n", dim);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
196 //static int i; if (++i == 2) halt();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
197
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
198 size_t edim;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
199 Type t = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
200 if (type)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
201 {
79
43073c7c7769 updated to 2.035
Trass3r
parents: 73
diff changeset
202 if (type == Type.terror)
43073c7c7769 updated to 2.035
Trass3r
parents: 73
diff changeset
203 return new ErrorExp();
43073c7c7769 updated to 2.035
Trass3r
parents: 73
diff changeset
204
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
205 t = type.toBasetype();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
206 switch (t.ty)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
207 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
208 case Tsarray:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
209 edim = cast(uint)(cast(TypeSArray)t).dim.toInteger();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
210 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
211
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
212 case Tpointer:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
213 case Tarray:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
214 edim = dim;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
215 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
216
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
217 default:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
218 assert(0);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
219 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
220 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
221 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
222 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
223 edim = value.dim;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
224 for (size_t i = 0, j = 0; i < value.dim; i++, j++)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
225 {
90
39648eb578f6 more Expressions work
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 84
diff changeset
226 if (index[i])
39648eb578f6 more Expressions work
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 84
diff changeset
227 j = cast(uint)(index[i].toInteger());
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
228 if (j >= edim)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
229 edim = j + 1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
230 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
231 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
232
90
39648eb578f6 more Expressions work
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 84
diff changeset
233 auto elements = new Expressions();
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
234 elements.setDim(edim);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
235 for (size_t i = 0, j = 0; i < value.dim; i++, j++)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
236 {
90
39648eb578f6 more Expressions work
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 84
diff changeset
237 if (index[i])
39648eb578f6 more Expressions work
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 84
diff changeset
238 j = cast(uint)(index[i].toInteger());
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
239 assert(j < edim);
127
9ee9b55452cb Identifiers, Initializers -> Vector
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
240 Initializer iz = value[i];
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
241 if (!iz)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
242 goto Lno;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
243 Expression ex = iz.toExpression();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
244 if (!ex)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
245 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
246 goto Lno;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
247 }
84
be2ab491772e Expressions -> Vector!Expression
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 79
diff changeset
248 elements[j] = ex;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
249 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
250
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
251 /* Fill in any missing elements with the default initializer
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
252 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
253 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
254 Expression init = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
255 for (size_t i = 0; i < edim; i++)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
256 {
90
39648eb578f6 more Expressions work
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 84
diff changeset
257 if (!elements[i])
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
258 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
259 if (!type)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
260 goto Lno;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
261 if (!init)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
262 init = (cast(TypeNext)t).next.defaultInit(Loc(0));
84
be2ab491772e Expressions -> Vector!Expression
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 79
diff changeset
263 elements[i] = init;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
264 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
265 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
266
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
267 Expression e2 = new ArrayLiteralExp(loc, elements);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
268 e2.type = type;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
269 return e2;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
270 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
271
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
272 Lno:
73
ef02e2e203c2 Updating to dmd2.033
korDen
parents: 72
diff changeset
273 return null;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
274 }
156
0c8cc2a10f99 + ArrayInitializer.toAssocArrayLiteral()
trass3r
parents: 130
diff changeset
275
0c8cc2a10f99 + ArrayInitializer.toAssocArrayLiteral()
trass3r
parents: 130
diff changeset
276 /********************************
0c8cc2a10f99 + ArrayInitializer.toAssocArrayLiteral()
trass3r
parents: 130
diff changeset
277 * If possible, convert array initializer to associative array initializer.
0c8cc2a10f99 + ArrayInitializer.toAssocArrayLiteral()
trass3r
parents: 130
diff changeset
278 */
0c8cc2a10f99 + ArrayInitializer.toAssocArrayLiteral()
trass3r
parents: 130
diff changeset
279 Expression toAssocArrayLiteral()
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
280 {
156
0c8cc2a10f99 + ArrayInitializer.toAssocArrayLiteral()
trass3r
parents: 130
diff changeset
281 Expression e;
0c8cc2a10f99 + ArrayInitializer.toAssocArrayLiteral()
trass3r
parents: 130
diff changeset
282
0c8cc2a10f99 + ArrayInitializer.toAssocArrayLiteral()
trass3r
parents: 130
diff changeset
283 // writef("ArrayInitializer::toAssocArrayInitializer()\n");
0c8cc2a10f99 + ArrayInitializer.toAssocArrayLiteral()
trass3r
parents: 130
diff changeset
284 // static int i; if (++i == 2) halt();
0c8cc2a10f99 + ArrayInitializer.toAssocArrayLiteral()
trass3r
parents: 130
diff changeset
285 Expressions keys = new Expressions();
0c8cc2a10f99 + ArrayInitializer.toAssocArrayLiteral()
trass3r
parents: 130
diff changeset
286 keys.setDim(value.dim);
0c8cc2a10f99 + ArrayInitializer.toAssocArrayLiteral()
trass3r
parents: 130
diff changeset
287 Expressions values = new Expressions();
0c8cc2a10f99 + ArrayInitializer.toAssocArrayLiteral()
trass3r
parents: 130
diff changeset
288 values.setDim(value.dim);
0c8cc2a10f99 + ArrayInitializer.toAssocArrayLiteral()
trass3r
parents: 130
diff changeset
289
0c8cc2a10f99 + ArrayInitializer.toAssocArrayLiteral()
trass3r
parents: 130
diff changeset
290 foreach (size_t i, Initializer iz; value)
0c8cc2a10f99 + ArrayInitializer.toAssocArrayLiteral()
trass3r
parents: 130
diff changeset
291 {
0c8cc2a10f99 + ArrayInitializer.toAssocArrayLiteral()
trass3r
parents: 130
diff changeset
292 e = index[i];
0c8cc2a10f99 + ArrayInitializer.toAssocArrayLiteral()
trass3r
parents: 130
diff changeset
293 if (!e)
0c8cc2a10f99 + ArrayInitializer.toAssocArrayLiteral()
trass3r
parents: 130
diff changeset
294 goto Lno;
0c8cc2a10f99 + ArrayInitializer.toAssocArrayLiteral()
trass3r
parents: 130
diff changeset
295 keys[i] = e;
0c8cc2a10f99 + ArrayInitializer.toAssocArrayLiteral()
trass3r
parents: 130
diff changeset
296
0c8cc2a10f99 + ArrayInitializer.toAssocArrayLiteral()
trass3r
parents: 130
diff changeset
297 if (!iz)
0c8cc2a10f99 + ArrayInitializer.toAssocArrayLiteral()
trass3r
parents: 130
diff changeset
298 goto Lno;
0c8cc2a10f99 + ArrayInitializer.toAssocArrayLiteral()
trass3r
parents: 130
diff changeset
299 e = iz.toExpression();
0c8cc2a10f99 + ArrayInitializer.toAssocArrayLiteral()
trass3r
parents: 130
diff changeset
300 if (!e)
0c8cc2a10f99 + ArrayInitializer.toAssocArrayLiteral()
trass3r
parents: 130
diff changeset
301 goto Lno;
0c8cc2a10f99 + ArrayInitializer.toAssocArrayLiteral()
trass3r
parents: 130
diff changeset
302 values[i] = e;
0c8cc2a10f99 + ArrayInitializer.toAssocArrayLiteral()
trass3r
parents: 130
diff changeset
303 }
0c8cc2a10f99 + ArrayInitializer.toAssocArrayLiteral()
trass3r
parents: 130
diff changeset
304 e = new AssocArrayLiteralExp(loc, keys, values);
0c8cc2a10f99 + ArrayInitializer.toAssocArrayLiteral()
trass3r
parents: 130
diff changeset
305 return e;
0c8cc2a10f99 + ArrayInitializer.toAssocArrayLiteral()
trass3r
parents: 130
diff changeset
306
0c8cc2a10f99 + ArrayInitializer.toAssocArrayLiteral()
trass3r
parents: 130
diff changeset
307 Lno:
0c8cc2a10f99 + ArrayInitializer.toAssocArrayLiteral()
trass3r
parents: 130
diff changeset
308 delete keys;
0c8cc2a10f99 + ArrayInitializer.toAssocArrayLiteral()
trass3r
parents: 130
diff changeset
309 delete values;
0c8cc2a10f99 + ArrayInitializer.toAssocArrayLiteral()
trass3r
parents: 130
diff changeset
310 error(loc, "not an associative array initializer");
0c8cc2a10f99 + ArrayInitializer.toAssocArrayLiteral()
trass3r
parents: 130
diff changeset
311 return new ErrorExp();
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
312 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
313
156
0c8cc2a10f99 + ArrayInitializer.toAssocArrayLiteral()
trass3r
parents: 130
diff changeset
314 override void toCBuffer(OutBuffer buf, HdrGenState* hgs)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
315 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
316 assert(false);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
317 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
318
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 59
diff changeset
319 override dt_t* toDt()
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
320 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
321 //printf("ArrayInitializer.toDt('%s')\n", toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
322 Type tb = type.toBasetype();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
323 Type tn = tb.nextOf().toBasetype();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
324
128
e6e542f37b94 Some more Array -> Vector conversions
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 127
diff changeset
325 scope dts = new Vector!(dt_t*)();
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
326 uint size;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
327 uint length;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
328 uint i;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
329 dt_t* dt;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
330 dt_t* d;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
331 dt_t** pdtend;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
332
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
333 //printf("\tdim = %d\n", dim);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
334 dts.setDim(dim);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
335 dts.zero();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
336
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
337 size = cast(uint)tn.size();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
338
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
339 length = 0;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
340 for (i = 0; i < index.dim; i++)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
341 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
342 Expression idx;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
343 Initializer val;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
344
90
39648eb578f6 more Expressions work
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 84
diff changeset
345 idx = index[i];
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
346 if (idx)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
347 length = cast(uint)idx.toInteger();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
348 //printf("\tindex[%d] = %p, length = %u, dim = %u\n", i, idx, length, dim);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
349
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
350 assert(length < dim);
127
9ee9b55452cb Identifiers, Initializers -> Vector
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
351 val = value[i];
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
352 dt = val.toDt();
128
e6e542f37b94 Some more Array -> Vector conversions
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 127
diff changeset
353 if (dts[length])
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
354 error(loc, "duplicate initializations for index %d", length);
128
e6e542f37b94 Some more Array -> Vector conversions
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 127
diff changeset
355 dts[length] = dt;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
356 length++;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
357 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
358
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
359 Expression edefault = tb.nextOf().defaultInit(Loc(0));
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
360
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
361 uint n = 1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
362 for (Type tbn = tn; tbn.ty == Tsarray; tbn = tbn.nextOf().toBasetype())
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
363 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
364 TypeSArray tsa = cast(TypeSArray)tbn;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
365 n *= tsa.dim.toInteger();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
366 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
367
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
368 d = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
369 pdtend = &d;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
370 for (i = 0; i < dim; i++)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
371 {
128
e6e542f37b94 Some more Array -> Vector conversions
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 127
diff changeset
372 dt = dts[i];
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
373 if (dt)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
374 pdtend = dtcat(pdtend, dt);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
375 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
376 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
377 for (int j = 0; j < n; j++)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
378 pdtend = edefault.toDt(pdtend);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
379 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
380 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
381 switch (tb.ty)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
382 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
383 case Tsarray:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
384 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
385 uint tadim;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
386 TypeSArray ta = cast(TypeSArray)tb;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
387
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
388 tadim = cast(uint)ta.dim.toInteger();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
389 if (dim < tadim)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
390 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
391 if (edefault.isBool(false))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
392 // pad out end of array
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
393 pdtend = dtnzeros(pdtend, size * (tadim - dim));
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
394 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
395 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
396 for (i = dim; i < tadim; i++)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
397 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
398 for (int j = 0; j < n; j++)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
399 pdtend = edefault.toDt(pdtend);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
400 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
401 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
402 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
403 else if (dim > tadim)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
404 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
405 debug writef("1: ");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
406 error(loc, "too many initializers, %d, for array[%d]", dim, tadim);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
407 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
408 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
409 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
410
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
411 case Tpointer:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
412 case Tarray:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
413 // Create symbol, and then refer to it
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
414 Symbol* s = static_sym();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
415 s.Sdt = d;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
416 outdata(s);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
417
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
418 d = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
419 if (tb.ty == Tarray)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
420 dtdword(&d, dim);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
421 dtxoff(&d, s, 0, TYnptr);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
422 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
423
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
424 default:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
425 assert(0);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
426 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
427 return d;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
428 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
429
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
430 dt_t* toDtBit() // for bit arrays
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
431 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
432 assert(false);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
433 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
434
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 59
diff changeset
435 override ArrayInitializer isArrayInitializer() { return this; }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 59
diff changeset
436 }