annotate dmd/StructInitializer.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 af1bebfd96a4
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.StructInitializer;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2
114
e28b18c23469 added a module dmd.common for commonly used stuff
Trass3r
parents: 84
diff changeset
3 import dmd.common;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4 import dmd.Initializer;
2
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
5 import dmd.TOK;
67
f708f0452e81 some of the backend/codegen stuff implemented
korDen
parents: 56
diff changeset
6 import dmd.TypeSArray;
2
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
7 import dmd.FuncLiteralDeclaration;
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
8 import dmd.TypeFunction;
56
51605de93870 TupleExp.optimize
korDen
parents: 51
diff changeset
9 import dmd.StructDeclaration;
51605de93870 TupleExp.optimize
korDen
parents: 51
diff changeset
10 import dmd.StructLiteralExp;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
11 import dmd.ArrayTypes;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
12 import dmd.Array;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
13 import dmd.Loc;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
14 import dmd.Type;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
15 import dmd.Scope;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
16 import dmd.Identifier;
2
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
17 import dmd.CompoundStatement;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
18 import dmd.AggregateDeclaration;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
19 import dmd.OutBuffer;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
20 import dmd.HdrGenState;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
21 import dmd.Expression;
2
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
22 import dmd.TypeStruct;
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
23 import dmd.TY;
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
24 import dmd.VarDeclaration;
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
25 import dmd.Dsymbol;
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
26 import dmd.Util;
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
27 import dmd.ExpInitializer;
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
28 import dmd.FuncExp;
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
29 import dmd.LINK;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
30
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
31 import dmd.backend.dt_t;
67
f708f0452e81 some of the backend/codegen stuff implemented
korDen
parents: 56
diff changeset
32 import dmd.backend.Util;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
33
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
34 class StructInitializer : Initializer
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
35 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
36 Identifiers field; // of Identifier *'s
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
37 Initializers value; // parallel array of Initializer *'s
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
38
128
e6e542f37b94 Some more Array -> Vector conversions
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 127
diff changeset
39 VarDeclarations vars; // parallel array of VarDeclaration *'s
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
40 AggregateDeclaration ad; // which aggregate this is for
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
41
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
42 this(Loc loc)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
43 {
178
e3afd1303184 Many small bugs fixed
korDen
parents: 135
diff changeset
44 register();
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
45 super(loc);
2
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
46 ad = null;
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
47
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
48 field = new Identifiers();
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
49 value = new Initializers();
51
b7d29f613539 StaticAssertStatement.syntaxCopy
korDen
parents: 2
diff changeset
50
128
e6e542f37b94 Some more Array -> Vector conversions
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 127
diff changeset
51 vars = new VarDeclarations();
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
52 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
53
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
54 override Initializer syntaxCopy()
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
55 {
127
9ee9b55452cb Identifiers, Initializers -> Vector
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
56 auto ai = new StructInitializer(loc);
2
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
57
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
58 assert(field.dim == value.dim);
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
59 ai.field.setDim(field.dim);
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
60 ai.value.setDim(value.dim);
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
61 for (int i = 0; i < field.dim; i++)
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
62 {
127
9ee9b55452cb Identifiers, Initializers -> Vector
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
63 ai.field[i] = field[i];
2
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
64
127
9ee9b55452cb Identifiers, Initializers -> Vector
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
65 auto init = value[i];
2
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
66 init = init.syntaxCopy();
127
9ee9b55452cb Identifiers, Initializers -> Vector
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
67 ai.value[i] = init;
2
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
68 }
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
69
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
70 return ai;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
71 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
72
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
73 void addInit(Identifier field, Initializer value)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
74 {
2
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
75 //printf("StructInitializer.addInit(field = %p, value = %p)\n", field, value);
127
9ee9b55452cb Identifiers, Initializers -> Vector
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
76 this.field.push(field);
9ee9b55452cb Identifiers, Initializers -> Vector
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
77 this.value.push(value);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
78 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
79
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
80 override Initializer semantic(Scope sc, Type t)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
81 {
2
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
82 int errors = 0;
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
83
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
84 //printf("StructInitializer.semantic(t = %s) %s\n", t.toChars(), toChars());
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
85 vars.setDim(field.dim);
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
86 t = t.toBasetype();
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
87 if (t.ty == Tstruct)
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
88 {
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
89 uint fieldi = 0;
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
90
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 130
diff changeset
91 auto ts = cast(TypeStruct)t;
2
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
92 ad = ts.sym;
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 130
diff changeset
93 if (ad.ctor)
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 130
diff changeset
94 error("%s %s has constructors, cannot use { initializers }, use %s( initializers ) instead",
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 130
diff changeset
95 ad.kind(), ad.toChars(), ad.toChars());
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 130
diff changeset
96 for (size_t i = 0; i < field.dim; i++)
2
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
97 {
127
9ee9b55452cb Identifiers, Initializers -> Vector
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
98 Identifier id = field[i];
9ee9b55452cb Identifiers, Initializers -> Vector
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
99 Initializer val = value[i];
2
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
100 Dsymbol s;
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
101 VarDeclaration v;
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
102
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
103 if (id is null)
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
104 {
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
105 if (fieldi >= ad.fields.dim)
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
106 {
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
107 error(loc, "too many initializers for %s", ad.toChars());
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
108 field.remove(i);
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
109 i--;
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
110 continue;
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
111 }
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
112 else
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
113 {
79
43073c7c7769 updated to 2.035
Trass3r
parents: 72
diff changeset
114 s = ad.fields[fieldi];
2
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
115 }
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
116 }
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
117 else
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
118 {
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
119 //s = ad.symtab.lookup(id);
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
120 s = ad.search(loc, id, 0);
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
121 if (!s)
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
122 {
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
123 error(loc, "'%s' is not a member of '%s'", id.toChars(), t.toChars());
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
124 continue;
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
125 }
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
126
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
127 // Find out which field index it is
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
128 for (fieldi = 0; 1; fieldi++)
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
129 {
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
130 if (fieldi >= ad.fields.dim)
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
131 {
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
132 s.error("is not a per-instance initializable field");
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
133 break;
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
134 }
79
43073c7c7769 updated to 2.035
Trass3r
parents: 72
diff changeset
135 if (s == ad.fields[fieldi])
2
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
136 break;
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
137 }
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
138 }
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
139 if (s && (v = s.isVarDeclaration()) !is null)
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
140 {
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
141 val = val.semantic(sc, v.type);
127
9ee9b55452cb Identifiers, Initializers -> Vector
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
142 value[i] = val;
128
e6e542f37b94 Some more Array -> Vector conversions
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 127
diff changeset
143 vars[i] = v;
2
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
144 }
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
145 else
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
146 {
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
147 error(loc, "%s is not a field of %s", id ? id.toChars() : s.toChars(), ad.toChars());
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
148 errors = 1;
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
149 }
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
150 fieldi++;
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
151 }
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
152 }
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
153 else if (t.ty == Tdelegate && value.dim == 0)
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
154 {
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
155 /* Rewrite as empty delegate literal { }
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
156 */
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
157 auto arguments = new Parameters;
2
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
158 Type tf = new TypeFunction(arguments, null, 0, LINK.LINKd);
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
159 FuncLiteralDeclaration fd = new FuncLiteralDeclaration(loc, Loc(0), tf, TOK.TOKdelegate, null);
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
160 fd.fbody = new CompoundStatement(loc, new Statements());
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
161 fd.endloc = loc;
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
162 Expression e = new FuncExp(loc, fd);
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
163 ExpInitializer ie = new ExpInitializer(loc, e);
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
164 return ie.semantic(sc, t);
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
165 }
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
166 else
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
167 {
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
168 error(loc, "a struct is not a valid initializer for a %s", t.toChars());
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
169 errors = 1;
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
170 }
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
171 if (errors)
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
172 {
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
173 field.setDim(0);
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
174 value.setDim(0);
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
175 vars.setDim(0);
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
176 }
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
177 return this;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
178 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
179
56
51605de93870 TupleExp.optimize
korDen
parents: 51
diff changeset
180 /***************************************
51605de93870 TupleExp.optimize
korDen
parents: 51
diff changeset
181 * This works by transforming a struct initializer into
51605de93870 TupleExp.optimize
korDen
parents: 51
diff changeset
182 * a struct literal. In the future, the two should be the
51605de93870 TupleExp.optimize
korDen
parents: 51
diff changeset
183 * same thing.
51605de93870 TupleExp.optimize
korDen
parents: 51
diff changeset
184 */
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
185 override Expression toExpression()
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
186 {
56
51605de93870 TupleExp.optimize
korDen
parents: 51
diff changeset
187 Expression e;
51605de93870 TupleExp.optimize
korDen
parents: 51
diff changeset
188
51605de93870 TupleExp.optimize
korDen
parents: 51
diff changeset
189 //printf("StructInitializer.toExpression() %s\n", toChars());
51605de93870 TupleExp.optimize
korDen
parents: 51
diff changeset
190 if (!ad) // if fwd referenced
51605de93870 TupleExp.optimize
korDen
parents: 51
diff changeset
191 {
51605de93870 TupleExp.optimize
korDen
parents: 51
diff changeset
192 return null;
51605de93870 TupleExp.optimize
korDen
parents: 51
diff changeset
193 }
51605de93870 TupleExp.optimize
korDen
parents: 51
diff changeset
194 StructDeclaration sd = ad.isStructDeclaration();
51605de93870 TupleExp.optimize
korDen
parents: 51
diff changeset
195 if (!sd)
51605de93870 TupleExp.optimize
korDen
parents: 51
diff changeset
196 return null;
51605de93870 TupleExp.optimize
korDen
parents: 51
diff changeset
197 Expressions elements = new Expressions();
51605de93870 TupleExp.optimize
korDen
parents: 51
diff changeset
198 for (size_t i = 0; i < value.dim; i++)
51605de93870 TupleExp.optimize
korDen
parents: 51
diff changeset
199 {
127
9ee9b55452cb Identifiers, Initializers -> Vector
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
200 if (field[i])
56
51605de93870 TupleExp.optimize
korDen
parents: 51
diff changeset
201 goto Lno;
127
9ee9b55452cb Identifiers, Initializers -> Vector
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
202 Initializer iz = value[i];
56
51605de93870 TupleExp.optimize
korDen
parents: 51
diff changeset
203 if (!iz)
51605de93870 TupleExp.optimize
korDen
parents: 51
diff changeset
204 goto Lno;
51605de93870 TupleExp.optimize
korDen
parents: 51
diff changeset
205 Expression ex = iz.toExpression();
51605de93870 TupleExp.optimize
korDen
parents: 51
diff changeset
206 if (!ex)
51605de93870 TupleExp.optimize
korDen
parents: 51
diff changeset
207 goto Lno;
84
be2ab491772e Expressions -> Vector!Expression
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 79
diff changeset
208 elements.push(ex);
56
51605de93870 TupleExp.optimize
korDen
parents: 51
diff changeset
209 }
51605de93870 TupleExp.optimize
korDen
parents: 51
diff changeset
210 e = new StructLiteralExp(loc, sd, elements);
51605de93870 TupleExp.optimize
korDen
parents: 51
diff changeset
211 e.type = sd.type;
51605de93870 TupleExp.optimize
korDen
parents: 51
diff changeset
212 return e;
51605de93870 TupleExp.optimize
korDen
parents: 51
diff changeset
213
51605de93870 TupleExp.optimize
korDen
parents: 51
diff changeset
214 Lno:
51605de93870 TupleExp.optimize
korDen
parents: 51
diff changeset
215 delete elements;
51605de93870 TupleExp.optimize
korDen
parents: 51
diff changeset
216 //error(loc, "struct initializers as expressions are not allowed");
51605de93870 TupleExp.optimize
korDen
parents: 51
diff changeset
217 return null;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
218 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
219
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
220 override void toCBuffer(OutBuffer buf, HdrGenState* hgs)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
221 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
222 assert(false);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
223 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
224
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
225 override dt_t* toDt()
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
226 {
128
e6e542f37b94 Some more Array -> Vector conversions
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 127
diff changeset
227 scope dts = new Vector!(dt_t*);
67
f708f0452e81 some of the backend/codegen stuff implemented
korDen
parents: 56
diff changeset
228 uint i;
f708f0452e81 some of the backend/codegen stuff implemented
korDen
parents: 56
diff changeset
229 uint j;
f708f0452e81 some of the backend/codegen stuff implemented
korDen
parents: 56
diff changeset
230 dt_t* dt;
f708f0452e81 some of the backend/codegen stuff implemented
korDen
parents: 56
diff changeset
231 dt_t* d;
f708f0452e81 some of the backend/codegen stuff implemented
korDen
parents: 56
diff changeset
232 dt_t** pdtend;
f708f0452e81 some of the backend/codegen stuff implemented
korDen
parents: 56
diff changeset
233 uint offset;
f708f0452e81 some of the backend/codegen stuff implemented
korDen
parents: 56
diff changeset
234
f708f0452e81 some of the backend/codegen stuff implemented
korDen
parents: 56
diff changeset
235 //printf("StructInitializer.toDt('%s')\n", toChars());
f708f0452e81 some of the backend/codegen stuff implemented
korDen
parents: 56
diff changeset
236 dts.setDim(ad.fields.dim);
f708f0452e81 some of the backend/codegen stuff implemented
korDen
parents: 56
diff changeset
237 dts.zero();
f708f0452e81 some of the backend/codegen stuff implemented
korDen
parents: 56
diff changeset
238
f708f0452e81 some of the backend/codegen stuff implemented
korDen
parents: 56
diff changeset
239 for (i = 0; i < vars.dim; i++)
f708f0452e81 some of the backend/codegen stuff implemented
korDen
parents: 56
diff changeset
240 {
128
e6e542f37b94 Some more Array -> Vector conversions
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 127
diff changeset
241 VarDeclaration v = vars[i];
127
9ee9b55452cb Identifiers, Initializers -> Vector
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
242 Initializer val = value[i];
67
f708f0452e81 some of the backend/codegen stuff implemented
korDen
parents: 56
diff changeset
243
f708f0452e81 some of the backend/codegen stuff implemented
korDen
parents: 56
diff changeset
244 //printf("vars[%d] = %s\n", i, v.toChars());
f708f0452e81 some of the backend/codegen stuff implemented
korDen
parents: 56
diff changeset
245
f708f0452e81 some of the backend/codegen stuff implemented
korDen
parents: 56
diff changeset
246 for (j = 0; 1; j++)
f708f0452e81 some of the backend/codegen stuff implemented
korDen
parents: 56
diff changeset
247 {
f708f0452e81 some of the backend/codegen stuff implemented
korDen
parents: 56
diff changeset
248 assert(j < dts.dim);
79
43073c7c7769 updated to 2.035
Trass3r
parents: 72
diff changeset
249 //printf(" adfield[%d] = %s\n", j, ((VarDeclaration *)ad.fields[j]).toChars());
43073c7c7769 updated to 2.035
Trass3r
parents: 72
diff changeset
250 if (cast(VarDeclaration)ad.fields[j] == v) // TODO: check if 'is' needs to be used here
67
f708f0452e81 some of the backend/codegen stuff implemented
korDen
parents: 56
diff changeset
251 {
128
e6e542f37b94 Some more Array -> Vector conversions
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 127
diff changeset
252 if (dts[j])
67
f708f0452e81 some of the backend/codegen stuff implemented
korDen
parents: 56
diff changeset
253 error(loc, "field %s of %s already initialized", v.toChars(), ad.toChars());
128
e6e542f37b94 Some more Array -> Vector conversions
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 127
diff changeset
254 dts[j] = val.toDt();
67
f708f0452e81 some of the backend/codegen stuff implemented
korDen
parents: 56
diff changeset
255 break;
f708f0452e81 some of the backend/codegen stuff implemented
korDen
parents: 56
diff changeset
256 }
f708f0452e81 some of the backend/codegen stuff implemented
korDen
parents: 56
diff changeset
257 }
f708f0452e81 some of the backend/codegen stuff implemented
korDen
parents: 56
diff changeset
258 }
f708f0452e81 some of the backend/codegen stuff implemented
korDen
parents: 56
diff changeset
259
f708f0452e81 some of the backend/codegen stuff implemented
korDen
parents: 56
diff changeset
260 dt = null;
f708f0452e81 some of the backend/codegen stuff implemented
korDen
parents: 56
diff changeset
261 pdtend = &dt;
f708f0452e81 some of the backend/codegen stuff implemented
korDen
parents: 56
diff changeset
262 offset = 0;
f708f0452e81 some of the backend/codegen stuff implemented
korDen
parents: 56
diff changeset
263 for (j = 0; j < dts.dim; j++)
f708f0452e81 some of the backend/codegen stuff implemented
korDen
parents: 56
diff changeset
264 {
128
e6e542f37b94 Some more Array -> Vector conversions
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 127
diff changeset
265 VarDeclaration v = ad.fields[j];
67
f708f0452e81 some of the backend/codegen stuff implemented
korDen
parents: 56
diff changeset
266
128
e6e542f37b94 Some more Array -> Vector conversions
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 127
diff changeset
267 d = dts[j];
67
f708f0452e81 some of the backend/codegen stuff implemented
korDen
parents: 56
diff changeset
268 if (!d)
f708f0452e81 some of the backend/codegen stuff implemented
korDen
parents: 56
diff changeset
269 {
f708f0452e81 some of the backend/codegen stuff implemented
korDen
parents: 56
diff changeset
270 // An instance specific initializer was not provided.
f708f0452e81 some of the backend/codegen stuff implemented
korDen
parents: 56
diff changeset
271 // Look to see if there's a default initializer from the
f708f0452e81 some of the backend/codegen stuff implemented
korDen
parents: 56
diff changeset
272 // struct definition
f708f0452e81 some of the backend/codegen stuff implemented
korDen
parents: 56
diff changeset
273 if (v.init)
f708f0452e81 some of the backend/codegen stuff implemented
korDen
parents: 56
diff changeset
274 {
f708f0452e81 some of the backend/codegen stuff implemented
korDen
parents: 56
diff changeset
275 d = v.init.toDt();
f708f0452e81 some of the backend/codegen stuff implemented
korDen
parents: 56
diff changeset
276 }
f708f0452e81 some of the backend/codegen stuff implemented
korDen
parents: 56
diff changeset
277 else if (v.offset >= offset)
f708f0452e81 some of the backend/codegen stuff implemented
korDen
parents: 56
diff changeset
278 {
f708f0452e81 some of the backend/codegen stuff implemented
korDen
parents: 56
diff changeset
279 uint k;
f708f0452e81 some of the backend/codegen stuff implemented
korDen
parents: 56
diff changeset
280 uint offset2 = v.offset + cast(uint)v.type.size();
f708f0452e81 some of the backend/codegen stuff implemented
korDen
parents: 56
diff changeset
281 // Make sure this field does not overlap any explicitly
f708f0452e81 some of the backend/codegen stuff implemented
korDen
parents: 56
diff changeset
282 // initialized field.
f708f0452e81 some of the backend/codegen stuff implemented
korDen
parents: 56
diff changeset
283 for (k = j + 1; 1; k++)
f708f0452e81 some of the backend/codegen stuff implemented
korDen
parents: 56
diff changeset
284 {
f708f0452e81 some of the backend/codegen stuff implemented
korDen
parents: 56
diff changeset
285 if (k == dts.dim) // didn't find any overlap
f708f0452e81 some of the backend/codegen stuff implemented
korDen
parents: 56
diff changeset
286 {
f708f0452e81 some of the backend/codegen stuff implemented
korDen
parents: 56
diff changeset
287 v.type.toDt(&d);
f708f0452e81 some of the backend/codegen stuff implemented
korDen
parents: 56
diff changeset
288 break;
f708f0452e81 some of the backend/codegen stuff implemented
korDen
parents: 56
diff changeset
289 }
128
e6e542f37b94 Some more Array -> Vector conversions
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 127
diff changeset
290 VarDeclaration v2 = ad.fields[k];
67
f708f0452e81 some of the backend/codegen stuff implemented
korDen
parents: 56
diff changeset
291
128
e6e542f37b94 Some more Array -> Vector conversions
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 127
diff changeset
292 if (v2.offset < offset2 && dts[k])
67
f708f0452e81 some of the backend/codegen stuff implemented
korDen
parents: 56
diff changeset
293 break; // overlap
f708f0452e81 some of the backend/codegen stuff implemented
korDen
parents: 56
diff changeset
294 }
f708f0452e81 some of the backend/codegen stuff implemented
korDen
parents: 56
diff changeset
295 }
f708f0452e81 some of the backend/codegen stuff implemented
korDen
parents: 56
diff changeset
296 }
f708f0452e81 some of the backend/codegen stuff implemented
korDen
parents: 56
diff changeset
297 if (d)
f708f0452e81 some of the backend/codegen stuff implemented
korDen
parents: 56
diff changeset
298 {
f708f0452e81 some of the backend/codegen stuff implemented
korDen
parents: 56
diff changeset
299 if (v.offset < offset)
f708f0452e81 some of the backend/codegen stuff implemented
korDen
parents: 56
diff changeset
300 error(loc, "duplicate union initialization for %s", v.toChars());
f708f0452e81 some of the backend/codegen stuff implemented
korDen
parents: 56
diff changeset
301 else
f708f0452e81 some of the backend/codegen stuff implemented
korDen
parents: 56
diff changeset
302 {
f708f0452e81 some of the backend/codegen stuff implemented
korDen
parents: 56
diff changeset
303 uint sz = dt_size(d);
f708f0452e81 some of the backend/codegen stuff implemented
korDen
parents: 56
diff changeset
304 uint vsz = cast(uint)v.type.size();
f708f0452e81 some of the backend/codegen stuff implemented
korDen
parents: 56
diff changeset
305 uint voffset = v.offset;
f708f0452e81 some of the backend/codegen stuff implemented
korDen
parents: 56
diff changeset
306
f708f0452e81 some of the backend/codegen stuff implemented
korDen
parents: 56
diff changeset
307 uint dim = 1;
f708f0452e81 some of the backend/codegen stuff implemented
korDen
parents: 56
diff changeset
308 for (Type vt = v.type.toBasetype();
f708f0452e81 some of the backend/codegen stuff implemented
korDen
parents: 56
diff changeset
309 vt.ty == Tsarray;
f708f0452e81 some of the backend/codegen stuff implemented
korDen
parents: 56
diff changeset
310 vt = vt.nextOf().toBasetype())
f708f0452e81 some of the backend/codegen stuff implemented
korDen
parents: 56
diff changeset
311 {
f708f0452e81 some of the backend/codegen stuff implemented
korDen
parents: 56
diff changeset
312 TypeSArray tsa = cast(TypeSArray)vt;
f708f0452e81 some of the backend/codegen stuff implemented
korDen
parents: 56
diff changeset
313 dim *= tsa.dim.toInteger();
f708f0452e81 some of the backend/codegen stuff implemented
korDen
parents: 56
diff changeset
314 }
f708f0452e81 some of the backend/codegen stuff implemented
korDen
parents: 56
diff changeset
315 assert(sz == vsz || sz * dim <= vsz);
f708f0452e81 some of the backend/codegen stuff implemented
korDen
parents: 56
diff changeset
316
f708f0452e81 some of the backend/codegen stuff implemented
korDen
parents: 56
diff changeset
317 for (size_t k = 0; k < dim; k++)
f708f0452e81 some of the backend/codegen stuff implemented
korDen
parents: 56
diff changeset
318 {
f708f0452e81 some of the backend/codegen stuff implemented
korDen
parents: 56
diff changeset
319 if (offset < voffset)
f708f0452e81 some of the backend/codegen stuff implemented
korDen
parents: 56
diff changeset
320 pdtend = dtnzeros(pdtend, voffset - offset);
f708f0452e81 some of the backend/codegen stuff implemented
korDen
parents: 56
diff changeset
321 if (!d)
f708f0452e81 some of the backend/codegen stuff implemented
korDen
parents: 56
diff changeset
322 {
f708f0452e81 some of the backend/codegen stuff implemented
korDen
parents: 56
diff changeset
323 if (v.init)
f708f0452e81 some of the backend/codegen stuff implemented
korDen
parents: 56
diff changeset
324 d = v.init.toDt();
f708f0452e81 some of the backend/codegen stuff implemented
korDen
parents: 56
diff changeset
325 else
f708f0452e81 some of the backend/codegen stuff implemented
korDen
parents: 56
diff changeset
326 v.type.toDt(&d);
f708f0452e81 some of the backend/codegen stuff implemented
korDen
parents: 56
diff changeset
327 }
f708f0452e81 some of the backend/codegen stuff implemented
korDen
parents: 56
diff changeset
328 pdtend = dtcat(pdtend, d);
f708f0452e81 some of the backend/codegen stuff implemented
korDen
parents: 56
diff changeset
329 d = null;
f708f0452e81 some of the backend/codegen stuff implemented
korDen
parents: 56
diff changeset
330 offset = voffset + sz;
f708f0452e81 some of the backend/codegen stuff implemented
korDen
parents: 56
diff changeset
331 voffset += vsz / dim;
f708f0452e81 some of the backend/codegen stuff implemented
korDen
parents: 56
diff changeset
332 if (sz == vsz)
f708f0452e81 some of the backend/codegen stuff implemented
korDen
parents: 56
diff changeset
333 break;
f708f0452e81 some of the backend/codegen stuff implemented
korDen
parents: 56
diff changeset
334 }
f708f0452e81 some of the backend/codegen stuff implemented
korDen
parents: 56
diff changeset
335 }
f708f0452e81 some of the backend/codegen stuff implemented
korDen
parents: 56
diff changeset
336 }
f708f0452e81 some of the backend/codegen stuff implemented
korDen
parents: 56
diff changeset
337 }
f708f0452e81 some of the backend/codegen stuff implemented
korDen
parents: 56
diff changeset
338
f708f0452e81 some of the backend/codegen stuff implemented
korDen
parents: 56
diff changeset
339 if (offset < ad.structsize)
f708f0452e81 some of the backend/codegen stuff implemented
korDen
parents: 56
diff changeset
340 dtnzeros(pdtend, ad.structsize - offset);
f708f0452e81 some of the backend/codegen stuff implemented
korDen
parents: 56
diff changeset
341
f708f0452e81 some of the backend/codegen stuff implemented
korDen
parents: 56
diff changeset
342 return dt;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
343 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
344
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
345 override StructInitializer isStructInitializer() { return this; }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
346 }