annotate dmd/StructLiteralExp.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 9a2a1ae6c8e5
children b0d41ff5e0df
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
1 module dmd.StructLiteralExp;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
2
114
e28b18c23469 added a module dmd.common for commonly used stuff
Trass3r
parents: 109
diff changeset
3 import dmd.common;
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
4 import dmd.Expression;
123
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
5 import dmd.GlobalExpressions;
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
6 import dmd.MOD;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
7 import dmd.TypeStruct;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
8 import dmd.TypeSArray;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
9 import dmd.expression.Util;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
10 import dmd.ErrorExp;
123
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
11 import dmd.Array;
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
12 import dmd.Dsymbol;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
13 import dmd.VarDeclaration;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
14 import dmd.StructDeclaration;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
15 import dmd.FuncDeclaration;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
16 import dmd.ThisDeclaration;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
17 import dmd.backend.elem;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
18 import dmd.InterState;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
19 import dmd.MATCH;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
20 import dmd.WANT;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
21 import dmd.TY;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
22 import dmd.Type;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
23 import dmd.OutBuffer;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
24 import dmd.Loc;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
25 import dmd.Scope;
109
ceda59b4d255 expression.c changes, now only ddoc should be left
Trass3r
parents: 90
diff changeset
26 import dmd.Initializer;
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
27 import dmd.InlineCostState;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
28 import dmd.IRState;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
29 import dmd.InlineDoState;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
30 import dmd.backend.Symbol;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
31 import dmd.HdrGenState;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
32 import dmd.backend.dt_t;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
33 import dmd.InlineScanState;
79
43073c7c7769 updated to 2.035
Trass3r
parents: 72
diff changeset
34 import dmd.ArrayLiteralExp;
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
35 import dmd.ArrayTypes;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
36 import dmd.TOK;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
37
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
38 import dmd.codegen.Util;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
39 import dmd.backend.Util;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
40 import dmd.backend.RTLSYM;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
41 import dmd.backend.TYM;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
42 import dmd.backend.mTY;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
43 import dmd.backend.OPER;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
44
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
45
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
46 class StructLiteralExp : Expression
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
47 {
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
48 StructDeclaration sd; // which aggregate this is for
79
43073c7c7769 updated to 2.035
Trass3r
parents: 72
diff changeset
49 Expressions elements; // parallels sd.fields[] with
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
50 // NULL entries for fields to skip
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
51
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
52 Symbol* sym; // back end symbol to initialize with literal
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
53 size_t soffset; // offset from start of s
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
54 int fillHoles; // fill alignment 'holes' with zero
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
55
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
56 this(Loc loc, StructDeclaration sd, Expressions elements)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
57 {
178
e3afd1303184 Many small bugs fixed
korDen
parents: 147
diff changeset
58 register();
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
59 super(loc, TOKstructliteral, StructLiteralExp.sizeof);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
60 this.sd = sd;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
61 this.elements = elements;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
62 this.sym = null;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
63 this.soffset = 0;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
64 this.fillHoles = 1;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
65 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
66
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
67 override Expression syntaxCopy()
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
68 {
123
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
69 return new StructLiteralExp(loc, sd, arraySyntaxCopy(elements));
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
70 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
71
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
72 override Expression semantic(Scope sc)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
73 {
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
74 Expression e;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
75 int nfields = sd.fields.dim - sd.isnested;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
76
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
77 version (LOGSEMANTIC) {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
78 printf("StructLiteralExp.semantic('%s')\n", toChars());
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
79 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
80 if (type)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
81 return this;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
82
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
83 // Run semantic() on each element
84
be2ab491772e Expressions -> Vector!Expression
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 79
diff changeset
84 foreach(size_t i, Expression e; elements)
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
85 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
86 if (!e)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
87 continue;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
88 e = e.semantic(sc);
84
be2ab491772e Expressions -> Vector!Expression
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 79
diff changeset
89 elements[i] = e;
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
90 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
91 expandTuples(elements);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
92 size_t offset = 0;
84
be2ab491772e Expressions -> Vector!Expression
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 79
diff changeset
93 foreach(size_t i, Expression e; elements)
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
94 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
95 if (!e)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
96 continue;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
97
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
98 if (!e.type)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
99 error("%s has no value", e.toChars());
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
100 e = resolveProperties(sc, e);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
101 if (i >= nfields)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
102 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
103 error("more initializers than fields of %s", sd.toChars());
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
104 return new ErrorExp();
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
105 }
84
be2ab491772e Expressions -> Vector!Expression
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 79
diff changeset
106 auto s = sd.fields[i];
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
107 VarDeclaration v = s.isVarDeclaration();
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
108 assert(v);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
109 if (v.offset < offset)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
110 error("overlapping initialization for %s", v.toChars());
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
111 offset = v.offset + cast(uint)v.type.size();
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
112
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
113 Type telem = v.type;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
114 while (!e.implicitConvTo(telem) && telem.toBasetype().ty == Tsarray)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
115 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
116 /* Static array initialization, as in:
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
117 * T[3][5] = e;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
118 */
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
119 telem = telem.toBasetype().nextOf();
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
120 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
121
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
122 e = e.implicitCastTo(sc, telem);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
123
84
be2ab491772e Expressions -> Vector!Expression
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 79
diff changeset
124 elements[i] = e;
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
125 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
126
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
127 /* Fill out remainder of elements[] with default initializers for fields[]
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
128 */
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
129 for (size_t i = elements.dim; i < nfields; i++)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
130 {
84
be2ab491772e Expressions -> Vector!Expression
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 79
diff changeset
131 VarDeclaration v = sd.fields[i];
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
132 assert(v);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
133 assert(!v.isThisDeclaration());
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
134
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
135 if (v.offset < offset)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
136 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
137 e = null;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
138 sd.hasUnions = 1;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
139 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
140 else
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
141 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
142 if (v.init)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
143 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
144 e = v.init.toExpression();
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
145 if (!e)
109
ceda59b4d255 expression.c changes, now only ddoc should be left
Trass3r
parents: 90
diff changeset
146 {
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
147 error("cannot make expression out of initializer for %s", v.toChars());
109
ceda59b4d255 expression.c changes, now only ddoc should be left
Trass3r
parents: 90
diff changeset
148 e = new ErrorExp();
ceda59b4d255 expression.c changes, now only ddoc should be left
Trass3r
parents: 90
diff changeset
149 }
ceda59b4d255 expression.c changes, now only ddoc should be left
Trass3r
parents: 90
diff changeset
150 else if (v.scope_)
ceda59b4d255 expression.c changes, now only ddoc should be left
Trass3r
parents: 90
diff changeset
151 {
ceda59b4d255 expression.c changes, now only ddoc should be left
Trass3r
parents: 90
diff changeset
152 // Do deferred semantic anaylsis
ceda59b4d255 expression.c changes, now only ddoc should be left
Trass3r
parents: 90
diff changeset
153 Initializer i2 = v.init.syntaxCopy();
ceda59b4d255 expression.c changes, now only ddoc should be left
Trass3r
parents: 90
diff changeset
154 i2 = i2.semantic(v.scope_, v.type);
ceda59b4d255 expression.c changes, now only ddoc should be left
Trass3r
parents: 90
diff changeset
155 e = i2.toExpression();
ceda59b4d255 expression.c changes, now only ddoc should be left
Trass3r
parents: 90
diff changeset
156 v.scope_ = null;
ceda59b4d255 expression.c changes, now only ddoc should be left
Trass3r
parents: 90
diff changeset
157 }
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
158 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
159 else
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
160 {
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 123
diff changeset
161 e = v.type.defaultInitLiteral(loc);
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
162 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
163 offset = v.offset + cast(uint)v.type.size();
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
164 }
84
be2ab491772e Expressions -> Vector!Expression
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 79
diff changeset
165 elements.push(e);
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
166 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
167
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
168 type = sd.type;
63
cab4c37afb89 A bunch of implementations
korDen
parents: 56
diff changeset
169 return this;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
170 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
171
109
ceda59b4d255 expression.c changes, now only ddoc should be left
Trass3r
parents: 90
diff changeset
172 /**************************************
ceda59b4d255 expression.c changes, now only ddoc should be left
Trass3r
parents: 90
diff changeset
173 * Gets expression at offset of type.
ceda59b4d255 expression.c changes, now only ddoc should be left
Trass3r
parents: 90
diff changeset
174 * Returns null if not found.
ceda59b4d255 expression.c changes, now only ddoc should be left
Trass3r
parents: 90
diff changeset
175 */
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
176 Expression getField(Type type, uint offset)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
177 {
79
43073c7c7769 updated to 2.035
Trass3r
parents: 72
diff changeset
178 //printf("StructLiteralExp.getField(this = %s, type = %s, offset = %u)\n",
43073c7c7769 updated to 2.035
Trass3r
parents: 72
diff changeset
179 // /*toChars()*/"", type.toChars(), offset);
43073c7c7769 updated to 2.035
Trass3r
parents: 72
diff changeset
180 Expression e = null;
43073c7c7769 updated to 2.035
Trass3r
parents: 72
diff changeset
181 int i = getFieldIndex(type, offset);
43073c7c7769 updated to 2.035
Trass3r
parents: 72
diff changeset
182
43073c7c7769 updated to 2.035
Trass3r
parents: 72
diff changeset
183 if (i != -1)
43073c7c7769 updated to 2.035
Trass3r
parents: 72
diff changeset
184 {
43073c7c7769 updated to 2.035
Trass3r
parents: 72
diff changeset
185 //printf("\ti = %d\n", i);
43073c7c7769 updated to 2.035
Trass3r
parents: 72
diff changeset
186 assert(i < elements.dim);
90
39648eb578f6 more Expressions work
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 85
diff changeset
187 e = elements[i];
79
43073c7c7769 updated to 2.035
Trass3r
parents: 72
diff changeset
188 if (e)
43073c7c7769 updated to 2.035
Trass3r
parents: 72
diff changeset
189 {
43073c7c7769 updated to 2.035
Trass3r
parents: 72
diff changeset
190 //writef("e = %s, e.type = %s\n", e.toChars(), e.type.toChars());
43073c7c7769 updated to 2.035
Trass3r
parents: 72
diff changeset
191
43073c7c7769 updated to 2.035
Trass3r
parents: 72
diff changeset
192 /* If type is a static array, and e is an initializer for that array,
43073c7c7769 updated to 2.035
Trass3r
parents: 72
diff changeset
193 * then the field initializer should be an array literal of e.
43073c7c7769 updated to 2.035
Trass3r
parents: 72
diff changeset
194 */
43073c7c7769 updated to 2.035
Trass3r
parents: 72
diff changeset
195 if (e.type != type && type.ty == Tsarray)
43073c7c7769 updated to 2.035
Trass3r
parents: 72
diff changeset
196 {
43073c7c7769 updated to 2.035
Trass3r
parents: 72
diff changeset
197 TypeSArray tsa = cast(TypeSArray)type;
43073c7c7769 updated to 2.035
Trass3r
parents: 72
diff changeset
198 size_t length = cast(size_t) tsa.dim.toInteger();
43073c7c7769 updated to 2.035
Trass3r
parents: 72
diff changeset
199 Expressions z = new Expressions;
43073c7c7769 updated to 2.035
Trass3r
parents: 72
diff changeset
200 z.setDim(length);
43073c7c7769 updated to 2.035
Trass3r
parents: 72
diff changeset
201 for (int q = 0; q < length; ++q)
90
39648eb578f6 more Expressions work
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 85
diff changeset
202 z[q] = e.copy();
79
43073c7c7769 updated to 2.035
Trass3r
parents: 72
diff changeset
203 e = new ArrayLiteralExp(loc, z);
43073c7c7769 updated to 2.035
Trass3r
parents: 72
diff changeset
204 e.type = type;
43073c7c7769 updated to 2.035
Trass3r
parents: 72
diff changeset
205 }
43073c7c7769 updated to 2.035
Trass3r
parents: 72
diff changeset
206 else
43073c7c7769 updated to 2.035
Trass3r
parents: 72
diff changeset
207 {
43073c7c7769 updated to 2.035
Trass3r
parents: 72
diff changeset
208 e = e.copy();
43073c7c7769 updated to 2.035
Trass3r
parents: 72
diff changeset
209 e.type = type;
43073c7c7769 updated to 2.035
Trass3r
parents: 72
diff changeset
210 }
43073c7c7769 updated to 2.035
Trass3r
parents: 72
diff changeset
211 }
43073c7c7769 updated to 2.035
Trass3r
parents: 72
diff changeset
212 }
43073c7c7769 updated to 2.035
Trass3r
parents: 72
diff changeset
213 return e;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
214 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
215
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
216 int getFieldIndex(Type type, uint offset)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
217 {
79
43073c7c7769 updated to 2.035
Trass3r
parents: 72
diff changeset
218 /* Find which field offset is by looking at the field offsets
43073c7c7769 updated to 2.035
Trass3r
parents: 72
diff changeset
219 */
43073c7c7769 updated to 2.035
Trass3r
parents: 72
diff changeset
220 if (elements.dim)
43073c7c7769 updated to 2.035
Trass3r
parents: 72
diff changeset
221 {
85
8e69d041a99d Previous commit didn't compile. Fixed.
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 84
diff changeset
222 foreach (size_t i, VarDeclaration v; sd.fields)
79
43073c7c7769 updated to 2.035
Trass3r
parents: 72
diff changeset
223 {
43073c7c7769 updated to 2.035
Trass3r
parents: 72
diff changeset
224 assert(v);
43073c7c7769 updated to 2.035
Trass3r
parents: 72
diff changeset
225
43073c7c7769 updated to 2.035
Trass3r
parents: 72
diff changeset
226 if (offset == v.offset && type.size() == v.type.size())
43073c7c7769 updated to 2.035
Trass3r
parents: 72
diff changeset
227 {
90
39648eb578f6 more Expressions work
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 85
diff changeset
228 auto e = elements[i];
79
43073c7c7769 updated to 2.035
Trass3r
parents: 72
diff changeset
229 if (e)
43073c7c7769 updated to 2.035
Trass3r
parents: 72
diff changeset
230 {
43073c7c7769 updated to 2.035
Trass3r
parents: 72
diff changeset
231 return i;
43073c7c7769 updated to 2.035
Trass3r
parents: 72
diff changeset
232 }
43073c7c7769 updated to 2.035
Trass3r
parents: 72
diff changeset
233 break;
43073c7c7769 updated to 2.035
Trass3r
parents: 72
diff changeset
234 }
43073c7c7769 updated to 2.035
Trass3r
parents: 72
diff changeset
235 }
43073c7c7769 updated to 2.035
Trass3r
parents: 72
diff changeset
236 }
43073c7c7769 updated to 2.035
Trass3r
parents: 72
diff changeset
237 return -1;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
238 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
239
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
240 override elem* toElem(IRState* irs)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
241 {
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
242 elem* e;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
243 size_t dim;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
244
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
245 //printf("StructLiteralExp.toElem() %s\n", toChars());
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
246
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
247 // struct symbol to initialize with the literal
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
248 Symbol* stmp = sym ? sym : symbol_genauto(sd.type.toCtype());
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
249
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
250 e = null;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
251
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
252 if (fillHoles)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
253 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
254 /* Initialize all alignment 'holes' to zero.
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
255 * Do before initializing fields, as the hole filling process
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
256 * can spill over into the fields.
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
257 */
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
258 size_t offset = 0;
84
be2ab491772e Expressions -> Vector!Expression
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 79
diff changeset
259 foreach (VarDeclaration v; sd.fields)
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
260 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
261 assert(v);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
262
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
263 e = el_combine(e, fillHole(stmp, &offset, v.offset, sd.structsize));
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
264 size_t vend = v.offset + cast(uint)v.type.size();
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
265 if (offset < vend)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
266 offset = vend;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
267 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
268 e = el_combine(e, fillHole(stmp, &offset, sd.structsize, sd.structsize));
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
269 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
270
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
271 if (elements)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
272 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
273 dim = elements.dim;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
274 assert(dim <= sd.fields.dim);
84
be2ab491772e Expressions -> Vector!Expression
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 79
diff changeset
275 foreach (size_t i, Expression el; elements)
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
276 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
277 if (!el)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
278 continue;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
279
84
be2ab491772e Expressions -> Vector!Expression
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 79
diff changeset
280 VarDeclaration v = sd.fields[i];
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
281 assert(v);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
282 assert(!v.isThisDeclaration());
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
283
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
284 elem* e1;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
285 if (tybasic(stmp.Stype.Tty) == TYnptr)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
286 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
287 e1 = el_var(stmp);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
288 e1.EV.sp.Voffset = soffset;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
289 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
290 else
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
291 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
292 e1 = el_ptr(stmp);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
293 if (soffset)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
294 e1 = el_bin(OPadd, TYnptr, e1, el_long(TYsize_t, soffset));
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
295 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
296 e1 = el_bin(OPadd, TYnptr, e1, el_long(TYsize_t, v.offset));
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
297 elem* ec = e1; // pointer to destination
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
298
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
299 elem* ep = el.toElem(irs);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
300
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
301 Type t1b = v.type.toBasetype();
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
302 Type t2b = el.type.toBasetype();
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
303 if (t1b.ty == Tsarray)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
304 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
305 if (t2b.implicitConvTo(t1b))
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
306 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
307 ///version (DMDV2) {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
308 // Determine if postblit is needed
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
309 int postblit = 0;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
310 if (needsPostblit(t1b))
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
311 postblit = 1;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
312
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
313 if (postblit)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
314 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
315 /* Generate:
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
316 * _d_arrayctor(ti, From: ep, To: e1)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
317 */
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
318 Expression ti = t1b.nextOf().toBasetype().getTypeInfo(null);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
319 elem* esize = el_long(TYsize_t, (cast(TypeSArray)t1b).dim.toInteger());
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
320 e1 = el_pair(TYdarray, esize, e1);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
321 ep = el_pair(TYdarray, el_copytree(esize), array_toPtr(el.type, ep));
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
322 ep = el_params(e1, ep, ti.toElem(irs), null);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
323 int rtl = RTLSYM_ARRAYCTOR;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
324 e1 = el_bin(OPcall, type.totym(), el_var(rtlsym[rtl]), ep);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
325 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
326 else
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
327 ///}
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
328 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
329 elem* esize = el_long(TYsize_t, t1b.size());
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
330 ep = array_toPtr(el.type, ep);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
331 e1 = el_bin(OPmemcpy, TYnptr, e1, el_param(ep, esize));
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
332 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
333 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
334 else
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
335 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
336 elem* edim = el_long(TYsize_t, t1b.size() / t2b.size());
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
337 e1 = setArray(e1, edim, t2b, ep, irs, TOKconstruct);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
338 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
339 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
340 else
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
341 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
342 tym_t ty = v.type.totym();
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
343 e1 = el_una(OPind, ty, e1);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
344 if (tybasic(ty) == TYstruct)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
345 e1.Enumbytes = cast(uint)v.type.size();
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
346 e1 = el_bin(OPeq, ty, e1, ep);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
347 if (tybasic(ty) == TYstruct)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
348 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
349 e1.Eoper = OPstreq;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
350 e1.Enumbytes = cast(uint)v.type.size();
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
351 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
352 version (DMDV2) {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
353 /* Call postblit() on e1
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
354 */
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
355 StructDeclaration sd = needsPostblit(v.type);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
356 if (sd)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
357 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
358 FuncDeclaration fd = sd.postblit;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
359 ec = el_copytree(ec);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
360 ec = callfunc(loc, irs, 1, Type.tvoid, ec, sd.type.pointerTo(), fd, fd.type, null, null);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
361 e1 = el_bin(OPcomma, ec.Ety, e1, ec);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
362 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
363 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
364 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
365 e = el_combine(e, e1);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
366 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
367 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
368
79
43073c7c7769 updated to 2.035
Trass3r
parents: 72
diff changeset
369 version (DMDV2)
43073c7c7769 updated to 2.035
Trass3r
parents: 72
diff changeset
370 {
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
371 if (sd.isnested)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
372 { // Initialize the hidden 'this' pointer
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
373 assert(sd.fields.dim);
84
be2ab491772e Expressions -> Vector!Expression
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 79
diff changeset
374 auto s = sd.fields[sd.fields.dim - 1];
be2ab491772e Expressions -> Vector!Expression
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 79
diff changeset
375 auto v = s.isThisDeclaration();
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
376 assert(v);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
377
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
378 elem* e1;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
379 if (tybasic(stmp.Stype.Tty) == TYnptr)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
380 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
381 e1 = el_var(stmp);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
382 e1.EV.sp.Voffset = soffset;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
383 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
384 else
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
385 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
386 e1 = el_ptr(stmp);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
387 if (soffset)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
388 e1 = el_bin(OPadd, TYnptr, e1, el_long(TYsize_t, soffset));
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
389 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
390 e1 = el_bin(OPadd, TYnptr, e1, el_long(TYsize_t, v.offset));
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
391 e1 = setEthis(loc, irs, e1, sd);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
392
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
393 e = el_combine(e, e1);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
394 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
395 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
396
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
397 elem* ev = el_var(stmp);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
398 ev.Enumbytes = sd.structsize;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
399 e = el_combine(e, ev);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
400 el_setLoc(e,loc);
67
f708f0452e81 some of the backend/codegen stuff implemented
korDen
parents: 64
diff changeset
401 return e;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
402 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
403
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
404 override bool checkSideEffect(int flag)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
405 {
79
43073c7c7769 updated to 2.035
Trass3r
parents: 72
diff changeset
406 bool f = 0;
43073c7c7769 updated to 2.035
Trass3r
parents: 72
diff changeset
407
90
39648eb578f6 more Expressions work
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 85
diff changeset
408 foreach (e; elements)
79
43073c7c7769 updated to 2.035
Trass3r
parents: 72
diff changeset
409 {
43073c7c7769 updated to 2.035
Trass3r
parents: 72
diff changeset
410 if (!e)
43073c7c7769 updated to 2.035
Trass3r
parents: 72
diff changeset
411 continue;
43073c7c7769 updated to 2.035
Trass3r
parents: 72
diff changeset
412
43073c7c7769 updated to 2.035
Trass3r
parents: 72
diff changeset
413 f |= e.checkSideEffect(2);
43073c7c7769 updated to 2.035
Trass3r
parents: 72
diff changeset
414 }
43073c7c7769 updated to 2.035
Trass3r
parents: 72
diff changeset
415 if (flag == 0 && f == 0)
43073c7c7769 updated to 2.035
Trass3r
parents: 72
diff changeset
416 Expression.checkSideEffect(0);
43073c7c7769 updated to 2.035
Trass3r
parents: 72
diff changeset
417 return f;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
418 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
419
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
420 override void toCBuffer(OutBuffer buf, HdrGenState* hgs)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
421 {
79
43073c7c7769 updated to 2.035
Trass3r
parents: 72
diff changeset
422 buf.writestring(sd.toChars());
43073c7c7769 updated to 2.035
Trass3r
parents: 72
diff changeset
423 buf.writeByte('(');
43073c7c7769 updated to 2.035
Trass3r
parents: 72
diff changeset
424 argsToCBuffer(buf, elements, hgs);
43073c7c7769 updated to 2.035
Trass3r
parents: 72
diff changeset
425 buf.writeByte(')');
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
426 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
427
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
428 override void toMangleBuffer(OutBuffer buf)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
429 {
79
43073c7c7769 updated to 2.035
Trass3r
parents: 72
diff changeset
430 size_t dim = elements ? elements.dim : 0;
43073c7c7769 updated to 2.035
Trass3r
parents: 72
diff changeset
431 buf.printf("S%u", dim);
43073c7c7769 updated to 2.035
Trass3r
parents: 72
diff changeset
432 for (size_t i = 0; i < dim; i++)
43073c7c7769 updated to 2.035
Trass3r
parents: 72
diff changeset
433 {
90
39648eb578f6 more Expressions work
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 85
diff changeset
434 auto e = elements[i];
79
43073c7c7769 updated to 2.035
Trass3r
parents: 72
diff changeset
435 if (e)
43073c7c7769 updated to 2.035
Trass3r
parents: 72
diff changeset
436 e.toMangleBuffer(buf);
43073c7c7769 updated to 2.035
Trass3r
parents: 72
diff changeset
437 else
43073c7c7769 updated to 2.035
Trass3r
parents: 72
diff changeset
438 buf.writeByte('v'); // 'v' for void
43073c7c7769 updated to 2.035
Trass3r
parents: 72
diff changeset
439 }
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
440 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
441
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
442 override void scanForNestedRef(Scope sc)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
443 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
444 assert(false);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
445 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
446
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
447 override Expression optimize(int result)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
448 {
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
449 if (elements)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
450 {
84
be2ab491772e Expressions -> Vector!Expression
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 79
diff changeset
451 foreach (size_t i, Expression e; elements)
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
452 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
453 if (!e)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
454 continue;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
455 e = e.optimize(WANTvalue | (result & WANTinterpret));
84
be2ab491772e Expressions -> Vector!Expression
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 79
diff changeset
456 elements[i] = e;
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
457 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
458 }
56
51605de93870 TupleExp.optimize
korDen
parents: 0
diff changeset
459 return this;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
460 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
461
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
462 override Expression interpret(InterState istate)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
463 {
123
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
464 Expressions expsx = null;
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
465
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
466 version (LOG) {
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
467 printf("StructLiteralExp.interpret() %.*s\n", toChars());
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
468 }
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
469 /* We don't know how to deal with overlapping fields
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
470 */
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
471 if (sd.hasUnions)
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
472 {
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
473 error("Unions with overlapping fields are not yet supported in CTFE");
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
474 return EXP_CANT_INTERPRET;
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
475 }
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
476
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
477 if (elements)
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
478 {
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
479 foreach (size_t i, Expression e; elements)
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
480 {
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
481 if (!e)
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
482 continue;
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
483
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
484 Expression ex = e.interpret(istate);
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
485 if (ex is EXP_CANT_INTERPRET)
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
486 {
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
487 delete expsx;
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
488 return EXP_CANT_INTERPRET;
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
489 }
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
490
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
491 /* If any changes, do Copy On Write
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
492 */
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
493 if (ex != e)
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
494 {
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
495 if (!expsx)
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
496 {
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
497 expsx = new Expressions();
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
498 expsx.setDim(elements.dim);
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
499 for (size_t j = 0; j < elements.dim; j++)
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
500 {
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
501 expsx[j] = elements[j];
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
502 }
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
503 }
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
504 expsx[i] = ex;
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
505 }
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
506 }
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
507 }
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
508 if (elements && expsx)
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
509 {
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
510 expandTuples(expsx);
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
511 if (expsx.dim != elements.dim)
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
512 {
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
513 delete expsx;
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
514 return EXP_CANT_INTERPRET;
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
515 }
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
516 StructLiteralExp se = new StructLiteralExp(loc, sd, expsx);
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
517 se.type = type;
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
518 return se;
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
519 }
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
520 return this;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
521 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
522
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
523 override dt_t** toDt(dt_t** pdt)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
524 {
147
9a2a1ae6c8e5 fix test runnable\structlit.d
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 135
diff changeset
525 scope dts = new Array;
123
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
526 dt_t *dt;
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
527 dt_t *d;
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
528 uint offset;
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
529
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
530 //printf("StructLiteralExp.toDt() %s)\n", toChars());
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
531 dts.setDim(sd.fields.dim);
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
532 dts.zero();
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
533 assert(elements.dim <= sd.fields.dim);
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
534
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
535 foreach (uint i, Expression e; elements)
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
536 {
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
537 if (!e)
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
538 continue;
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
539
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
540 dt = null;
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
541 e.toDt(&dt);
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
542 dts.data[i] = dt;
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
543 }
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
544
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
545 offset = 0;
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
546 foreach (uint j, VarDeclaration v; sd.fields)
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
547 {
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
548 d = cast(dt_t*)dts.data[j];
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
549 if (!d)
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
550 { // An instance specific initializer was not provided.
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
551 // Look to see if there's a default initializer from the
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
552 // struct definition
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
553 if (v.init)
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
554 {
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
555 d = v.init.toDt();
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
556 }
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
557 else if (v.offset >= offset)
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
558 {
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
559 uint k;
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
560 uint offset2 = v.offset + cast(uint)v.type.size();
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
561 // Make sure this field (v) does not overlap any explicitly
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
562 // initialized field.
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
563 for (k = j + 1; 1; k++)
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
564 {
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
565 if (k == dts.dim) // didn't find any overlap
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
566 {
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
567 v.type.toDt(&d);
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
568 break;
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
569 }
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
570 VarDeclaration v2 = sd.fields[k];
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
571
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
572 if (v2.offset < offset2 && dts.data[k])
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
573 break; // overlap
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
574 }
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
575 }
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
576 }
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
577 if (d)
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
578 {
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
579 if (v.offset < offset)
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
580 error("duplicate union initialization for %s", v.toChars());
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
581 else
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
582 {
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
583 uint sz = dt_size(d);
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
584 uint vsz = cast(uint)v.type.size();
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
585 uint voffset = v.offset;
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
586 assert(sz <= vsz);
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
587
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
588 uint dim = 1;
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
589 for (Type vt = v.type.toBasetype(); vt.ty == Tsarray; vt = vt.nextOf().toBasetype())
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
590 {
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
591 TypeSArray tsa = cast(TypeSArray)vt;
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
592 dim *= tsa.dim.toInteger();
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
593 }
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
594
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
595 for (size_t i = 0; i < dim; i++)
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
596 {
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
597 if (offset < voffset)
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
598 pdt = dtnzeros(pdt, voffset - offset);
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
599 if (!d)
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
600 {
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
601 if (v.init)
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
602 d = v.init.toDt();
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
603 else
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
604 v.type.toDt(&d);
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
605 }
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
606 pdt = dtcat(pdt, d);
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
607 d = null;
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
608 offset = voffset + sz;
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
609 voffset += vsz / dim;
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
610 if (sz == vsz)
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
611 break;
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
612 }
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
613 }
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
614 }
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
615 }
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
616
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
617 if (offset < sd.structsize)
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
618 pdt = dtnzeros(pdt, sd.structsize - offset);
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
619
9e39c7de8438 Make dmd test suite compile
korDen
parents: 114
diff changeset
620 return pdt;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
621 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
622
79
43073c7c7769 updated to 2.035
Trass3r
parents: 72
diff changeset
623 version(DMDV2)
43073c7c7769 updated to 2.035
Trass3r
parents: 72
diff changeset
624 {
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
625 override int isLvalue()
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
626 {
79
43073c7c7769 updated to 2.035
Trass3r
parents: 72
diff changeset
627 return 1;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
628 }
79
43073c7c7769 updated to 2.035
Trass3r
parents: 72
diff changeset
629 }
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
630
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
631 override Expression toLvalue(Scope sc, Expression e)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
632 {
79
43073c7c7769 updated to 2.035
Trass3r
parents: 72
diff changeset
633 return this;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
634 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
635
79
43073c7c7769 updated to 2.035
Trass3r
parents: 72
diff changeset
636 version(DMDV2)
43073c7c7769 updated to 2.035
Trass3r
parents: 72
diff changeset
637 {
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
638 override bool canThrow()
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
639 {
64
4290d870944a More fixes
korDen
parents: 63
diff changeset
640 return arrayExpressionCanThrow(elements);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
641 }
79
43073c7c7769 updated to 2.035
Trass3r
parents: 72
diff changeset
642 }
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
643
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
644 override MATCH implicitConvTo(Type t)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
645 {
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
646 static if (false) {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
647 printf("StructLiteralExp.implicitConvTo(this=%.*s, type=%.*s, t=%.*s)\n",
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
648 toChars(), type.toChars(), t.toChars());
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
649 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
650 MATCH m = Expression.implicitConvTo(t);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
651 if (m != MATCHnomatch)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
652 return m;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
653 if (type.ty == t.ty && type.ty == Tstruct && (cast(TypeStruct)type).sym == (cast(TypeStruct)t).sym)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
654 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
655 m = MATCHconst;
84
be2ab491772e Expressions -> Vector!Expression
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 79
diff changeset
656 foreach(e; elements)
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
657 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
658 Type te = e.type;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
659 if (t.mod == 0)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
660 te = te.mutableOf();
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
661 else
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
662 {
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 123
diff changeset
663 assert(t.mod == MODimmutable);
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
664 te = te.invariantOf();
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
665 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
666 MATCH m2 = e.implicitConvTo(te);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
667 //printf("\t%s => %s, match = %d\n", e.toChars(), te.toChars(), m2);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
668 if (m2 < m)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
669 m = m2;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
670 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
671 }
64
4290d870944a More fixes
korDen
parents: 63
diff changeset
672 return m;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
673 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
674
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
675 override int inlineCost(InlineCostState* ics)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
676 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
677 assert(false);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
678 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
679
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
680 override Expression doInline(InlineDoState ids)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
681 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
682 assert(false);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
683 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
684
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 67
diff changeset
685 override Expression inlineScan(InlineScanState* iss)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
686 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
687 assert(false);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
688 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
689 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
690