annotate dmd/BinExp.d @ 84:be2ab491772e

Expressions -> Vector!Expression
author Eldar Insafutdinov <e.insafutdinov@gmail.com>
date Mon, 30 Aug 2010 16:12:19 +0100
parents 43073c7c7769
children 39648eb578f6
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1 module dmd.BinExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2
63
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
3 import dmd.SliceExp;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
4 import dmd.IndexExp;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
5 import dmd.StructDeclaration;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
6 import dmd.expression.ArrayLength;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
7 import dmd.expression.Equal;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
8 import dmd.expression.Index;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
9 import dmd.ArrayLiteralExp;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
10 import dmd.AssocArrayLiteralExp;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
11 import dmd.StringExp;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
12 import dmd.TypeSArray;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
13 import dmd.PtrExp;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
14 import dmd.SymOffExp;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
15 import dmd.Declaration;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
16 import dmd.StructLiteralExp;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
17 import dmd.Expression;
63
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
18 import dmd.interpret.Util;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
19 import dmd.GlobalExpressions;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
20 import dmd.Cast;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
21 import dmd.CastExp;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
22 import dmd.VarDeclaration;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
23 import dmd.DotVarExp;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
24 import dmd.Loc;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
25 import dmd.ClassDeclaration;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
26 import dmd.OutBuffer;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
27 import dmd.HdrGenState;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
28 import dmd.TOK;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
29 import dmd.IRState;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
30 import dmd.Scope;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
31 import dmd.Type;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
32 import dmd.InterState;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
33 import dmd.InlineCostState;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
34 import dmd.InlineScanState;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
35 import dmd.InlineDoState;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
36 import dmd.AggregateDeclaration;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
37 import dmd.Identifier;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
38 import dmd.MATCH;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
39 import dmd.declaration.Match;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
40 import dmd.ArrayTypes;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
41 import dmd.TY;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
42 import dmd.TypeClass;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
43 import dmd.TypeStruct;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
44 import dmd.Dsymbol;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
45 import dmd.FuncDeclaration;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
46 import dmd.TemplateDeclaration;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
47 import dmd.DotIdExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
48 import dmd.ErrorExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
49 import dmd.WANT;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
50 import dmd.IntegerExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
51 import dmd.MulExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
52 import dmd.Token;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
53 import dmd.PREC;
12
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
54 import dmd.StringValue;
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
55 import dmd.StringTable;
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
56 import dmd.Argument;
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
57 import dmd.Statement;
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
58 import dmd.ForeachRangeStatement;
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
59 import dmd.ArrayLengthExp;
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
60 import dmd.IdentifierExp;
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
61 import dmd.ExpStatement;
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
62 import dmd.CompoundStatement;
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
63 import dmd.TypeFunction;
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
64 import dmd.LINK;
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
65 import dmd.Lexer;
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
66 import dmd.ReturnStatement;
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
67 import dmd.Id;
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
68 import dmd.STC;
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
69 import dmd.PROT;
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
70 import dmd.VarExp;
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
71 import dmd.CallExp;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
72
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
73 import dmd.expression.Util;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
74
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
75 import dmd.backend.elem;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
76 import dmd.backend.Util;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
77
12
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
78 import dmd.backend.iasm : binary;
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
79
63
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
80 import std.exception : assumeUnique;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
81 import core.stdc.stdlib : calloc;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
82 import std.stdio : writef;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
83
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
84 /**************************************
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
85 * Combine types.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
86 * Output:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
87 * *pt merged type, if *pt is not null
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
88 * *pe1 rewritten e1
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
89 * *pe2 rewritten e2
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
90 * Returns:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
91 * !=0 success
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
92 * 0 failed
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
93 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
94
12
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
95 /**************************************
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
96 * Hash table of array op functions already generated or known about.
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
97 */
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
98
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
99 __gshared StringTable arrayfuncs;
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
100
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
101 int typeMerge(Scope sc, Expression e, Type* pt, Expression* pe1, Expression* pe2)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
102 {
60
a8740d0dbea4 TypeTypeof.toCBuffer2
korDen
parents: 56
diff changeset
103 //printf("typeMerge() %.*s op %.*s\n", (*pe1).toChars(), (*pe2).toChars());
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
104 //dump(0);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
105
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
106 Expression e1 = (*pe1).integralPromotions(sc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
107 Expression e2 = (*pe2).integralPromotions(sc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
108
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
109 Type t1 = e1.type;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
110 Type t2 = e2.type;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
111 assert(t1);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
112 Type t = t1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
113
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
114 //if (t1) printf("\tt1 = %s\n", t1.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
115 //if (t2) printf("\tt2 = %s\n", t2.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
116 debug {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
117 if (!t2) writef("\te2 = '%s'\n", e2.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
118 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
119 assert(t2);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
120
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
121 Type t1b = t1.toBasetype();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
122 Type t2b = t2.toBasetype();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
123
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
124 TY ty = cast(TY)Type.impcnvResult[t1b.ty][t2b.ty];
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
125 if (ty != TY.Terror)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
126 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
127 TY ty1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
128 TY ty2;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
129
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
130 ty1 = cast(TY)Type.impcnvType1[t1b.ty][t2b.ty];
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
131 ty2 = cast(TY)Type.impcnvType2[t1b.ty][t2b.ty];
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
132
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
133 if (t1b.ty == ty1) // if no promotions
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
134 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
135 if (t1 == t2)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
136 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
137 t = t1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
138 goto Lret;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
139 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
140
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
141 if (t1b == t2b)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
142 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
143 t = t1b;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
144 goto Lret;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
145 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
146 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
147
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
148 t = Type.basic[ty];
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
149
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
150 t1 = Type.basic[ty1];
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
151 t2 = Type.basic[ty2];
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
152
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
153 e1 = e1.castTo(sc, t1);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
154 e2 = e2.castTo(sc, t2);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
155 //printf("after typeCombine():\n");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
156 //dump(0);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
157 //printf("ty = %d, ty1 = %d, ty2 = %d\n", ty, ty1, ty2);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
158 goto Lret;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
159 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
160
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
161 t1 = t1b;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
162 t2 = t2b;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
163
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
164 Lagain:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
165 if (t1 == t2)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
166 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
167 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
168 else if (t1.ty == TY.Tpointer && t2.ty == TY.Tpointer)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
169 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
170 // Bring pointers to compatible type
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
171 Type t1n = t1.nextOf();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
172 Type t2n = t2.nextOf();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
173
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
174 if (t1n == t2n) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
175 ;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
176 } else if (t1n.ty == TY.Tvoid) {// pointers to void are always compatible
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
177 t = t2;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
178 } else if (t2n.ty == TY.Tvoid) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
179 ;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
180 } else if (t1n.mod != t2n.mod) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
181 t1 = t1n.mutableOf().constOf().pointerTo();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
182 t2 = t2n.mutableOf().constOf().pointerTo();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
183 t = t1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
184 goto Lagain;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
185 } else if (t1n.ty == TY.Tclass && t2n.ty == TY.Tclass) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
186 ClassDeclaration cd1 = t1n.isClassHandle();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
187 ClassDeclaration cd2 = t2n.isClassHandle();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
188 int offset;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
189
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
190 if (cd1.isBaseOf(cd2, &offset))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
191 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
192 if (offset)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
193 e2 = e2.castTo(sc, t);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
194 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
195 else if (cd2.isBaseOf(cd1, &offset))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
196 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
197 t = t2;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
198 if (offset)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
199 e1 = e1.castTo(sc, t);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
200 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
201 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
202 goto Lincompatible;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
203 } else {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
204 goto Lincompatible;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
205 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
206 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
207 else if ((t1.ty == TY.Tsarray || t1.ty == TY.Tarray) &&
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
208 e2.op == TOK.TOKnull && t2.ty == TY.Tpointer && t2.nextOf().ty == TY.Tvoid)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
209 { /* (T[n] op void*)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
210 * (T[] op void*)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
211 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
212 goto Lx1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
213 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
214 else if ((t2.ty == TY.Tsarray || t2.ty == TY.Tarray) &&
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
215 e1.op == TOK.TOKnull && t1.ty == TY.Tpointer && t1.nextOf().ty == TY.Tvoid)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
216 { /* (void* op T[n])
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
217 * (void* op T[])
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
218 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
219 goto Lx2;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
220 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
221 else if ((t1.ty == TY.Tsarray || t1.ty == TY.Tarray) && t1.implicitConvTo(t2))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
222 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
223 goto Lt2;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
224 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
225 else if ((t2.ty == TY.Tsarray || t2.ty == TY.Tarray) && t2.implicitConvTo(t1))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
226 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
227 goto Lt1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
228 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
229 /* If one is mutable and the other invariant, then retry
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
230 * with both of them as const
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
231 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
232 else if ((t1.ty == TY.Tsarray || t1.ty == TY.Tarray || t1.ty == TY.Tpointer) &&
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
233 (t2.ty == TY.Tsarray || t2.ty == TY.Tarray || t2.ty == TY.Tpointer) &&
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
234 t1.nextOf().mod != t2.nextOf().mod
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
235 )
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
236 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
237 if (t1.ty == TY.Tpointer)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
238 t1 = t1.nextOf().mutableOf().constOf().pointerTo();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
239 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
240 t1 = t1.nextOf().mutableOf().constOf().arrayOf();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
241
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
242 if (t2.ty == TY.Tpointer)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
243 t2 = t2.nextOf().mutableOf().constOf().pointerTo();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
244 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
245 t2 = t2.nextOf().mutableOf().constOf().arrayOf();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
246 t = t1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
247 goto Lagain;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
248 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
249 else if (t1.ty == TY.Tclass || t2.ty == TY.Tclass)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
250 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
251 while (1)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
252 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
253 int i1 = e2.implicitConvTo(t1);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
254 int i2 = e1.implicitConvTo(t2);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
255
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
256 if (i1 && i2)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
257 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
258 // We have the case of class vs. void*, so pick class
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
259 if (t1.ty == TY.Tpointer)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
260 i1 = 0;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
261 else if (t2.ty == TY.Tpointer)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
262 i2 = 0;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
263 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
264
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
265 if (i2)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
266 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
267 goto Lt2;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
268 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
269 else if (i1)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
270 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
271 goto Lt1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
272 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
273 else if (t1.ty == TY.Tclass && t2.ty == TY.Tclass)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
274 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
275 TypeClass tc1 = cast(TypeClass)t1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
276 TypeClass tc2 = cast(TypeClass)t2;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
277
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
278 /* Pick 'tightest' type
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
279 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
280 ClassDeclaration cd1 = tc1.sym.baseClass;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
281 ClassDeclaration cd2 = tc2.sym.baseClass;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
282
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
283 if (cd1 && cd2)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
284 { t1 = cd1.type;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
285 t2 = cd2.type;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
286 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
287 else if (cd1)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
288 t1 = cd1.type;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
289 else if (cd2)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
290 t2 = cd2.type;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
291 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
292 goto Lincompatible;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
293 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
294 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
295 goto Lincompatible;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
296 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
297 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
298 else if (t1.ty == TY.Tstruct && t2.ty == TY.Tstruct)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
299 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
300 if ((cast(TypeStruct)t1).sym != (cast(TypeStruct)t2).sym)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
301 goto Lincompatible;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
302 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
303 else if ((e1.op == TOK.TOKstring || e1.op == TOK.TOKnull) && e1.implicitConvTo(t2))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
304 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
305 goto Lt2;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
306 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
307 else if ((e2.op == TOK.TOKstring || e2.op == TOK.TOKnull) && e2.implicitConvTo(t1))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
308 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
309 goto Lt1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
310 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
311 else if (t1.ty == TY.Tsarray && t2.ty == TY.Tsarray &&
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
312 e2.implicitConvTo(t1.nextOf().arrayOf()))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
313 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
314 Lx1:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
315 t = t1.nextOf().arrayOf();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
316 e1 = e1.castTo(sc, t);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
317 e2 = e2.castTo(sc, t);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
318 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
319 else if (t1.ty == TY.Tsarray && t2.ty == TY.Tsarray &&
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
320 e1.implicitConvTo(t2.nextOf().arrayOf()))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
321 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
322 Lx2:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
323 t = t2.nextOf().arrayOf();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
324 e1 = e1.castTo(sc, t);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
325 e2 = e2.castTo(sc, t);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
326 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
327 else if (t1.isintegral() && t2.isintegral())
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
328 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
329 assert(0);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
330 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
331 else if (e1.op == TOK.TOKslice && t1.ty == TY.Tarray &&
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
332 e2.implicitConvTo(t1.nextOf()))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
333 { // T[] op T
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
334 e2 = e2.castTo(sc, t1.nextOf());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
335 t = t1.nextOf().arrayOf();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
336 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
337 else if (e2.op == TOK.TOKslice && t2.ty == TY.Tarray &&
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
338 e1.implicitConvTo(t2.nextOf()))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
339 { // T op T[]
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
340 e1 = e1.castTo(sc, t2.nextOf());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
341 t = t2.nextOf().arrayOf();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
342
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
343 //printf("test %s\n", e.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
344 e1 = e1.optimize(WANT.WANTvalue);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
345 if (e && e.isCommutative() && e1.isConst())
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
346 { /* Swap operands to minimize number of functions generated
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
347 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
348 //printf("swap %s\n", e.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
349 Expression tmp = e1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
350 e1 = e2;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
351 e2 = tmp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
352 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
353 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
354 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
355 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
356 Lincompatible:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
357 return 0;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
358 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
359 Lret:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
360 if (!*pt)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
361 *pt = t;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
362 *pe1 = e1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
363 *pe2 = e2;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
364 static if (false) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
365 printf("-typeMerge() %s op %s\n", e1.toChars(), e2.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
366 if (e1.type) printf("\tt1 = %s\n", e1.type.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
367 if (e2.type) printf("\tt2 = %s\n", e2.type.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
368 printf("\ttype = %s\n", t.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
369 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
370 //dump(0);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
371 return 1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
372
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
373
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
374 Lt1:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
375 e2 = e2.castTo(sc, t1);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
376 t = t1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
377 goto Lret;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
378
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
379 Lt2:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
380 e1 = e1.castTo(sc, t2);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
381 t = t2;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
382 goto Lret;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
383 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
384
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
385 class BinExp : Expression
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
386 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
387 Expression e1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
388 Expression e2;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
389
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
390 this(Loc loc, TOK op, int size, Expression e1, Expression e2)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
391 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
392 super(loc, op, size);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
393 this.e1 = e1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
394 this.e2 = e2;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
395 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
396
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 63
diff changeset
397 override Expression syntaxCopy()
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
398 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
399 BinExp e = cast(BinExp)copy();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
400 e.type = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
401 e.e1 = e.e1.syntaxCopy();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
402 e.e2 = e.e2.syntaxCopy();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
403
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
404 return e;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
405 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
406
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 63
diff changeset
407 override Expression semantic(Scope sc)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
408 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
409 version (LOGSEMANTIC) {
60
a8740d0dbea4 TypeTypeof.toCBuffer2
korDen
parents: 56
diff changeset
410 printf("BinExp.semantic('%.*s')\n", toChars());
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
411 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
412 e1 = e1.semantic(sc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
413 if (!e1.type && !(op == TOK.TOKassign && e1.op == TOK.TOKdottd)) // a.template = e2
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
414 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
415 error("%s has no value", e1.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
416 e1.type = Type.terror;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
417 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
418 e2 = e2.semantic(sc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
419 if (!e2.type)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
420 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
421 error("%s has no value", e2.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
422 e2.type = Type.terror;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
423 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
424 return this;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
425 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
426
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
427 Expression semanticp(Scope sc)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
428 {
60
a8740d0dbea4 TypeTypeof.toCBuffer2
korDen
parents: 56
diff changeset
429 BinExp.semantic(sc);
a8740d0dbea4 TypeTypeof.toCBuffer2
korDen
parents: 56
diff changeset
430
a8740d0dbea4 TypeTypeof.toCBuffer2
korDen
parents: 56
diff changeset
431 e1 = resolveProperties(sc, e1);
a8740d0dbea4 TypeTypeof.toCBuffer2
korDen
parents: 56
diff changeset
432 e2 = resolveProperties(sc, e2);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
433 return this;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
434 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
435
56
51605de93870 TupleExp.optimize
korDen
parents: 12
diff changeset
436 /***************************
51605de93870 TupleExp.optimize
korDen
parents: 12
diff changeset
437 * Common semantic routine for some xxxAssignExp's.
51605de93870 TupleExp.optimize
korDen
parents: 12
diff changeset
438 */
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
439 Expression commonSemanticAssign(Scope sc)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
440 {
56
51605de93870 TupleExp.optimize
korDen
parents: 12
diff changeset
441 Expression e;
51605de93870 TupleExp.optimize
korDen
parents: 12
diff changeset
442
51605de93870 TupleExp.optimize
korDen
parents: 12
diff changeset
443 if (!type)
51605de93870 TupleExp.optimize
korDen
parents: 12
diff changeset
444 {
51605de93870 TupleExp.optimize
korDen
parents: 12
diff changeset
445 BinExp.semantic(sc);
51605de93870 TupleExp.optimize
korDen
parents: 12
diff changeset
446 e2 = resolveProperties(sc, e2);
51605de93870 TupleExp.optimize
korDen
parents: 12
diff changeset
447
51605de93870 TupleExp.optimize
korDen
parents: 12
diff changeset
448 e = op_overload(sc);
51605de93870 TupleExp.optimize
korDen
parents: 12
diff changeset
449 if (e)
51605de93870 TupleExp.optimize
korDen
parents: 12
diff changeset
450 return e;
51605de93870 TupleExp.optimize
korDen
parents: 12
diff changeset
451
51605de93870 TupleExp.optimize
korDen
parents: 12
diff changeset
452 if (e1.op == TOKslice)
51605de93870 TupleExp.optimize
korDen
parents: 12
diff changeset
453 {
51605de93870 TupleExp.optimize
korDen
parents: 12
diff changeset
454 // T[] op= ...
51605de93870 TupleExp.optimize
korDen
parents: 12
diff changeset
455 typeCombine(sc);
51605de93870 TupleExp.optimize
korDen
parents: 12
diff changeset
456 type = e1.type;
51605de93870 TupleExp.optimize
korDen
parents: 12
diff changeset
457 return arrayOp(sc);
51605de93870 TupleExp.optimize
korDen
parents: 12
diff changeset
458 }
51605de93870 TupleExp.optimize
korDen
parents: 12
diff changeset
459
51605de93870 TupleExp.optimize
korDen
parents: 12
diff changeset
460 e1 = e1.modifiableLvalue(sc, e1);
51605de93870 TupleExp.optimize
korDen
parents: 12
diff changeset
461 e1.checkScalar();
51605de93870 TupleExp.optimize
korDen
parents: 12
diff changeset
462 type = e1.type;
51605de93870 TupleExp.optimize
korDen
parents: 12
diff changeset
463 if (type.toBasetype().ty == Tbool)
51605de93870 TupleExp.optimize
korDen
parents: 12
diff changeset
464 {
51605de93870 TupleExp.optimize
korDen
parents: 12
diff changeset
465 error("operator not allowed on bool expression %s", toChars());
51605de93870 TupleExp.optimize
korDen
parents: 12
diff changeset
466 }
51605de93870 TupleExp.optimize
korDen
parents: 12
diff changeset
467 typeCombine(sc);
51605de93870 TupleExp.optimize
korDen
parents: 12
diff changeset
468 e1.checkArithmetic();
51605de93870 TupleExp.optimize
korDen
parents: 12
diff changeset
469 e2.checkArithmetic();
51605de93870 TupleExp.optimize
korDen
parents: 12
diff changeset
470
51605de93870 TupleExp.optimize
korDen
parents: 12
diff changeset
471 if (op == TOKmodass && e2.type.iscomplex())
51605de93870 TupleExp.optimize
korDen
parents: 12
diff changeset
472 { error("cannot perform modulo complex arithmetic");
51605de93870 TupleExp.optimize
korDen
parents: 12
diff changeset
473 return new ErrorExp();
51605de93870 TupleExp.optimize
korDen
parents: 12
diff changeset
474 }
51605de93870 TupleExp.optimize
korDen
parents: 12
diff changeset
475 }
51605de93870 TupleExp.optimize
korDen
parents: 12
diff changeset
476 return this;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
477 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
478
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
479 Expression commonSemanticAssignIntegral(Scope sc)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
480 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
481 Expression e;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
482
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
483 if (!type)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
484 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
485 BinExp.semantic(sc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
486 e2 = resolveProperties(sc, e2);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
487
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
488 e = op_overload(sc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
489 if (e)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
490 return e;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
491
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
492 if (e1.op == TOK.TOKslice)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
493 { // T[] op= ...
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
494 typeCombine(sc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
495 type = e1.type;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
496 return arrayOp(sc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
497 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
498
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
499 e1 = e1.modifiableLvalue(sc, e1);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
500 e1.checkScalar();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
501 type = e1.type;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
502 if (type.toBasetype().ty == TY.Tbool)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
503 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
504 e2 = e2.implicitCastTo(sc, type);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
505 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
506
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
507 typeCombine(sc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
508 e1.checkIntegral();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
509 e2.checkIntegral();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
510 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
511
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
512 return this;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
513 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
514
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 63
diff changeset
515 override bool checkSideEffect(int flag)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
516 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
517 switch (op) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
518 case TOK.TOKplusplus:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
519 case TOK.TOKminusminus:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
520 case TOK.TOKassign:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
521 case TOK.TOKconstruct:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
522 case TOK.TOKblit:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
523 case TOK.TOKaddass:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
524 case TOK.TOKminass:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
525 case TOK.TOKcatass:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
526 case TOK.TOKmulass:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
527 case TOK.TOKdivass:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
528 case TOK.TOKmodass:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
529 case TOK.TOKshlass:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
530 case TOK.TOKshrass:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
531 case TOK.TOKushrass:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
532 case TOK.TOKandass:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
533 case TOK.TOKorass:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
534 case TOK.TOKxorass:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
535 case TOK.TOKin:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
536 case TOK.TOKremove:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
537 return true;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
538
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
539 default:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
540 return Expression.checkSideEffect(flag);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
541 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
542 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
543
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 63
diff changeset
544 override void toCBuffer(OutBuffer buf, HdrGenState* hgs)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
545 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
546 expToCBuffer(buf, hgs, e1, precedence[op]);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
547 buf.writeByte(' ');
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
548 buf.writestring(Token.toChars(op));
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
549 buf.writeByte(' ');
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
550 expToCBuffer(buf, hgs, e2, cast(PREC)(precedence[op] + 1));
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
551 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
552
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
553 /****************************************
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
554 * Scale addition/subtraction to/from pointer.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
555 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
556 Expression scaleFactor(Scope sc)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
557 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
558 ulong stride;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
559 Type t1b = e1.type.toBasetype();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
560 Type t2b = e2.type.toBasetype();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
561
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
562 if (t1b.ty == Tpointer && t2b.isintegral())
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
563 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
564 // Need to adjust operator by the stride
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
565 // Replace (ptr + int) with (ptr + (int * stride))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
566 Type t = Type.tptrdiff_t;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
567
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
568 stride = t1b.nextOf().size(loc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
569 if (!t.equals(t2b))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
570 e2 = e2.castTo(sc, t);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
571 e2 = new MulExp(loc, e2, new IntegerExp(Loc(0), stride, t));
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
572 e2.type = t;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
573 type = e1.type;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
574 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
575 else if (t2b.ty == Tpointer && t1b.isintegral())
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
576 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
577 // Need to adjust operator by the stride
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
578 // Replace (int + ptr) with (ptr + (int * stride))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
579 Type t = Type.tptrdiff_t;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
580 Expression e;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
581
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
582 stride = t2b.nextOf().size(loc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
583 if (!t.equals(t1b))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
584 e = e1.castTo(sc, t);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
585 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
586 e = e1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
587 e = new MulExp(loc, e, new IntegerExp(Loc(0), stride, t));
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
588 e.type = t;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
589 type = e2.type;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
590 e1 = e2;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
591 e2 = e;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
592 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
593 return this;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
594 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
595
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
596 /************************************
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
597 * Bring leaves to common type.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
598 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
599 Expression typeCombine(Scope sc)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
600 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
601 Type t1 = e1.type.toBasetype();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
602 Type t2 = e2.type.toBasetype();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
603
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
604 if (op == TOK.TOKmin || op == TOK.TOKadd)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
605 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
606 if (t1.ty == TY.Tstruct)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
607 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
608 if (t2.ty == TY.Tstruct && (cast(TypeStruct)t1).sym is (cast(TypeStruct)t2).sym)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
609 goto Lerror;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
610 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
611 else if (t1.ty == TY.Tclass)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
612 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
613 if (t2.ty == TY.Tclass)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
614 goto Lerror;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
615 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
616 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
617
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
618 if (!typeMerge(sc, this, &type, &e1, &e2))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
619 goto Lerror;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
620 return this;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
621
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
622 Lerror:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
623 incompatibleTypes();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
624 type = Type.terror;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
625 e1 = new ErrorExp();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
626 e2 = new ErrorExp();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
627 return this;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
628 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
629
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 63
diff changeset
630 override Expression optimize(int result)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
631 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
632 //printf("BinExp.optimize(result = %d) %s\n", result, toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
633 if (op != TOK.TOKconstruct && op != TOK.TOKblit) // don't replace const variable with its initializer
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
634 e1 = e1.optimize(result);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
635
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
636 e2 = e2.optimize(result);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
637 if (op == TOK.TOKshlass || op == TOK.TOKshrass || op == TOK.TOKushrass)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
638 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
639 if (e2.isConst() == 1)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
640 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
641 long i2 = e2.toInteger();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
642 ulong sz = e1.type.size() * 8;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
643
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
644 if (i2 < 0 || i2 > sz)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
645 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
646 error("shift assign by %jd is outside the range 0..%zu", i2, sz);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
647 e2 = new IntegerExp(0);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
648 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
649 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
650 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
651
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
652 return this;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
653 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
654
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
655 bool isunsigned()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
656 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
657 assert(false);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
658 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
659
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
660 void incompatibleTypes()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
661 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
662 error("incompatible types for ((%s) %s (%s)): '%s' and '%s'",
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
663 e1.toChars(), Token.toChars(op), e2.toChars(),
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
664 e1.type.toChars(), e2.type.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
665 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
666
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 63
diff changeset
667 override void dump(int indent)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
668 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
669 assert(false);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
670 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
671
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
672 void scanForNestedRef(Scope *sc)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
673 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
674 assert(false);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
675 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
676
63
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
677 Expression interpretCommon(InterState istate, Expression *(*fp)(Type *, Expression *, Expression *))
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
678 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
679 assert(false);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
680 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
681
63
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
682 Expression interpretCommon2(InterState istate, Expression *(*fp)(TOK, Type *, Expression *, Expression *))
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
683 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
684 assert(false);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
685 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
686
63
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
687 Expression interpretAssignCommon(InterState istate, Expression (*fp)(Type, Expression, Expression), int post = 0)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
688 {
63
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
689 version (LOG) {
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
690 printf("BinExp.interpretAssignCommon() %.*s\n", toChars());
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
691 }
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
692 Expression e = EXP_CANT_INTERPRET;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
693 Expression e1 = this.e1;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
694
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
695 if (fp)
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
696 {
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
697 if (e1.op == TOKcast)
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
698 {
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
699 CastExp ce = cast(CastExp)e1;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
700 e1 = ce.e1;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
701 }
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
702 }
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
703 if (e1 is EXP_CANT_INTERPRET)
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
704 return e1;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
705 Expression e2 = this.e2.interpret(istate);
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
706 if (e2 is EXP_CANT_INTERPRET)
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
707 return e2;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
708
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
709 // Chase down rebinding of out and ref.
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
710 if (e1.op == TOKvar)
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
711 {
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
712 VarExp ve = cast(VarExp)e1;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
713 VarDeclaration v = ve.var.isVarDeclaration();
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
714 if (v && v.value && v.value.op == TOKvar)
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
715 {
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
716 VarExp ve2 = cast(VarExp)v.value;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
717 if (ve2.var.isSymbolDeclaration())
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
718 {
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
719 // This can happen if v is a struct initialized to
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
720 // 0 using an __initZ SymbolDeclaration from
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
721 // TypeStruct.defaultInit()
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
722 }
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
723 else
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
724 e1 = v.value;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
725 }
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
726 else if (v && v.value && (v.value.op==TOKindex || v.value.op == TOKdotvar))
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
727 {
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
728 // It is no longer be a TOKvar, eg when a[4] is passed by ref.
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
729 e1 = v.value;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
730 }
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
731 }
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
732
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
733 // To reduce code complexity of handling dotvar expressions,
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
734 // extract the aggregate now.
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
735 Expression aggregate;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
736 if (e1.op == TOKdotvar) {
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
737 aggregate = (cast(DotVarExp)e1).e1;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
738 // Get rid of 'this'.
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
739 if (aggregate.op == TOKthis && istate.localThis)
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
740 aggregate = istate.localThis;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
741 }
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
742
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
743 /* Assignment to variable of the form:
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
744 * v = e2
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
745 */
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
746 if (e1.op == TOKvar)
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
747 {
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
748 VarExp ve = cast(VarExp)e1;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
749 VarDeclaration v = ve.var.isVarDeclaration();
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
750 assert(v);
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
751 if (v && v.isDataseg())
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
752 {
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
753 // Can't modify global or static data
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
754 error("%s cannot be modified at compile time", v.toChars());
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
755 return EXP_CANT_INTERPRET;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
756 }
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
757 if (v && !v.isDataseg())
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
758 {
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
759 Expression ev = v.value;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
760 if (fp && !ev)
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
761 {
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
762 error("variable %s is used before initialization", v.toChars());
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
763 return e;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
764 }
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
765 if (fp)
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
766 e2 = (*fp)(v.type, ev, e2);
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
767 else
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
768 {
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
769 /* Look for special case of struct being initialized with 0.
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
770 */
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
771 if (v.type.toBasetype().ty == Tstruct && e2.op == TOKint64)
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
772 {
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
773 e2 = v.type.defaultInit(Loc(0));
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
774 }
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
775 e2 = Cast(v.type, v.type, e2);
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
776 }
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
777 if (e2 is EXP_CANT_INTERPRET)
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
778 return e2;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
779
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
780 addVarToInterstate(istate, v);
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
781 v.value = e2;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
782 e = Cast(type, type, post ? ev : e2);
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
783 }
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
784 }
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
785 else if (e1.op == TOKdotvar && aggregate.op == TOKdotvar)
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
786 {
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
787 // eg v.u.var = e2, v[3].u.var = e2, etc.
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
788 error("Nested struct assignment %s is not yet supported in CTFE", toChars());
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
789 }
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
790 /* Assignment to struct member of the form:
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
791 * v.var = e2
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
792 */
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
793 else if (e1.op == TOKdotvar && aggregate.op == TOKvar)
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
794 {
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
795 VarDeclaration v = (cast(VarExp)aggregate).var.isVarDeclaration();
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
796
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
797 if (v.isDataseg())
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
798 {
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
799 // Can't modify global or static data
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
800 error("%s cannot be modified at compile time", v.toChars());
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
801 return EXP_CANT_INTERPRET;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
802 } else {
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
803 // Chase down rebinding of out and ref
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
804 if (v.value && v.value.op == TOKvar)
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
805 {
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
806 VarExp ve2 = cast(VarExp)v.value;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
807 if (ve2.var.isSymbolDeclaration())
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
808 {
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
809 // This can happen if v is a struct initialized to
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
810 // 0 using an __initZ SymbolDeclaration from
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
811 // TypeStruct.defaultInit()
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
812 }
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
813 else
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
814 v = ve2.var.isVarDeclaration();
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
815 assert(v);
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
816 }
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
817 }
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
818 if (fp && !v.value)
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
819 {
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
820 error("variable %s is used before initialization", v.toChars());
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
821 return e;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
822 }
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
823 if (v.value is null && v.init.isVoidInitializer())
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
824 {
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
825 /* Since a void initializer initializes to undefined
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
826 * values, it is valid here to use the default initializer.
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
827 * No attempt is made to determine if someone actually relies
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
828 * on the void value - to do that we'd need a VoidExp.
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
829 * That's probably a good enhancement idea.
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
830 */
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
831 v.value = v.type.defaultInit(Loc(0));
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
832 }
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
833 Expression vie = v.value;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
834 if (vie.op == TOKvar)
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
835 {
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
836 Declaration d = (cast(VarExp)vie).var;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
837 vie = getVarExp(e1.loc, istate, d);
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
838 }
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
839 if (vie.op != TOKstructliteral)
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
840 return EXP_CANT_INTERPRET;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
841 StructLiteralExp se = cast(StructLiteralExp)vie;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
842 VarDeclaration vf = (cast(DotVarExp)e1).var.isVarDeclaration();
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
843 if (!vf)
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
844 return EXP_CANT_INTERPRET;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
845 int fieldi = se.getFieldIndex(type, vf.offset);
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
846 if (fieldi == -1)
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
847 return EXP_CANT_INTERPRET;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
848 Expression ev = se.getField(type, vf.offset);
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
849 if (fp)
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
850 e2 = (*fp)(type, ev, e2);
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
851 else
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
852 e2 = Cast(type, type, e2);
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
853 if (e2 is EXP_CANT_INTERPRET)
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
854 return e2;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
855
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
856 addVarToInterstate(istate, v);
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
857
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
858 /* Create new struct literal reflecting updated fieldi
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
859 */
84
be2ab491772e Expressions -> Vector!Expression
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 79
diff changeset
860 auto expsx = changeOneElement(se.elements, fieldi, e2);
63
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
861 v.value = new StructLiteralExp(se.loc, se.sd, expsx);
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
862 v.value.type = se.type;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
863
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
864 e = Cast(type, type, post ? ev : e2);
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
865 }
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
866 /* Assignment to struct member of the form:
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
867 * *(symoffexp) = e2
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
868 */
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
869 else if (e1.op == TOKstar && (cast(PtrExp)e1).e1.op == TOKsymoff)
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
870 {
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
871 SymOffExp soe = cast(SymOffExp)(cast(PtrExp)e1).e1;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
872 VarDeclaration v = soe.var.isVarDeclaration();
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
873
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
874 if (v.isDataseg())
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
875 {
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
876 error("%s cannot be modified at compile time", v.toChars());
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
877 return EXP_CANT_INTERPRET;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
878 }
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
879 if (fp && !v.value)
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
880 {
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
881 error("variable %s is used before initialization", v.toChars());
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
882 return e;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
883 }
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
884 Expression vie = v.value;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
885 if (vie.op == TOKvar)
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
886 {
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
887 Declaration d = (cast(VarExp)vie).var;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
888 vie = getVarExp(e1.loc, istate, d);
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
889 }
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
890 if (vie.op != TOKstructliteral)
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
891 return EXP_CANT_INTERPRET;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
892 StructLiteralExp se = cast(StructLiteralExp)vie;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
893 int fieldi = se.getFieldIndex(type, soe.offset);
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
894 if (fieldi == -1)
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
895 return EXP_CANT_INTERPRET;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
896 Expression ev = se.getField(type, soe.offset);
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
897 if (fp)
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
898 e2 = (*fp)(type, ev, e2);
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
899 else
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
900 e2 = Cast(type, type, e2);
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
901 if (e2 is EXP_CANT_INTERPRET)
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
902 return e2;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
903
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
904 addVarToInterstate(istate, v);
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
905
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
906 /* Create new struct literal reflecting updated fieldi
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
907 */
84
be2ab491772e Expressions -> Vector!Expression
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 79
diff changeset
908 auto expsx = changeOneElement(se.elements, fieldi, e2);
63
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
909 v.value = new StructLiteralExp(se.loc, se.sd, expsx);
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
910 v.value.type = se.type;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
911
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
912 e = Cast(type, type, post ? ev : e2);
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
913 }
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
914 /* Assignment to array element of the form:
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
915 * a[i] = e2
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
916 */
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
917 else if (e1.op == TOKindex && (cast(IndexExp)e1).e1.op == TOKvar)
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
918 {
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
919 IndexExp ie = cast(IndexExp)e1;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
920 VarExp ve = cast(VarExp)ie.e1;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
921 VarDeclaration v = ve.var.isVarDeclaration();
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
922 if (!v || v.isDataseg())
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
923 {
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
924 error("%s cannot be modified at compile time", v ? v.toChars(): "void");
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
925 return EXP_CANT_INTERPRET;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
926 }
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
927 if (v.value && v.value.op == TOKvar)
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
928 {
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
929 VarExp ve2 = cast(VarExp)v.value;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
930 if (ve2.var.isSymbolDeclaration())
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
931 {
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
932 // This can happen if v is a struct initialized to
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
933 // 0 using an __initZ SymbolDeclaration from
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
934 // TypeStruct.defaultInit()
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
935 }
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
936 else
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
937 v = ve2.var.isVarDeclaration();
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
938 assert(v);
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
939 }
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
940 if (!v.value)
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
941 {
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
942 if (fp)
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
943 {
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
944 error("variable %s is used before initialization", v.toChars());
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
945 return e;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
946 }
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
947
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
948 Type t = v.type.toBasetype();
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
949 if (t.ty == Tsarray)
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
950 {
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
951 /* This array was void initialized. Create a
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
952 * default initializer for it.
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
953 * What we should do is fill the array literal with
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
954 * null data, so use-before-initialized can be detected.
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
955 * But we're too lazy at the moment to do it, as that
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
956 * involves redoing Index() and whoever calls it.
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
957 */
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
958
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
959 size_t dim = cast(size_t)(cast(TypeSArray)t).dim.toInteger();
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
960 v.value = createBlockDuplicatedArrayLiteral(v.type,
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
961 v.type.defaultInit(Loc(0)), dim);
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
962 }
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
963 else
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
964 return EXP_CANT_INTERPRET;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
965 }
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
966
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
967 ArrayLiteralExp ae = null;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
968 AssocArrayLiteralExp aae = null;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
969 StringExp se = null;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
970 if (v.value.op == TOKarrayliteral)
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
971 ae = cast(ArrayLiteralExp)v.value;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
972 else if (v.value.op == TOKassocarrayliteral)
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
973 aae = cast(AssocArrayLiteralExp)v.value;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
974 else if (v.value.op == TOKstring)
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
975 se = cast(StringExp)v.value;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
976 else if (v.value.op == TOKnull)
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
977 {
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
978 // This would be a runtime segfault
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
979 error("Cannot index null array %.*s", v.toChars());
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
980 return EXP_CANT_INTERPRET;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
981 }
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
982 else
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
983 return EXP_CANT_INTERPRET;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
984
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
985 /* Set the $ variable
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
986 */
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
987 Expression ee = ArrayLength(Type.tsize_t, v.value);
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
988 if (ee !is EXP_CANT_INTERPRET && ie.lengthVar)
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
989 ie.lengthVar.value = ee;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
990 Expression index = ie.e2.interpret(istate);
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
991 if (index is EXP_CANT_INTERPRET)
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
992 return EXP_CANT_INTERPRET;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
993 Expression ev;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
994 if (fp || ae || se) // not for aae, because key might not be there
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
995 {
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
996 ev = Index(type, v.value, index);
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
997 if (ev is EXP_CANT_INTERPRET)
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
998 return EXP_CANT_INTERPRET;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
999 }
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1000
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1001 if (fp)
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1002 e2 = (*fp)(type, ev, e2);
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1003 else
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1004 e2 = Cast(type, type, e2);
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1005 if (e2 is EXP_CANT_INTERPRET)
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1006 return e2;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1007
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1008 addVarToInterstate(istate, v);
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1009 if (ae)
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1010 {
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1011 /* Create new array literal reflecting updated elem
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1012 */
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1013 int elemi = cast(int)index.toInteger();
84
be2ab491772e Expressions -> Vector!Expression
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 79
diff changeset
1014 auto expsx = changeOneElement(ae.elements, elemi, e2);
63
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1015 v.value = new ArrayLiteralExp(ae.loc, expsx);
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1016 v.value.type = ae.type;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1017 }
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1018 else if (aae)
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1019 {
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1020 /* Create new associative array literal reflecting updated key/value
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1021 */
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1022 Expressions keysx = aae.keys;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1023 Expressions valuesx = new Expressions();
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1024 valuesx.setDim(aae.values.dim);
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1025 int updated = 0;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1026 for (size_t j = valuesx.dim; j; )
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1027 {
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1028 j--;
84
be2ab491772e Expressions -> Vector!Expression
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 79
diff changeset
1029 Expression ekey = aae.keys[j];
63
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1030 Expression ex = Equal(TOKequal, Type.tbool, ekey, index);
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1031 if (ex is EXP_CANT_INTERPRET)
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1032 return EXP_CANT_INTERPRET;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1033 if (ex.isBool(true))
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1034 {
84
be2ab491772e Expressions -> Vector!Expression
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 79
diff changeset
1035 valuesx[j] = e2;
63
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1036 updated = 1;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1037 }
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1038 else
84
be2ab491772e Expressions -> Vector!Expression
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 79
diff changeset
1039 valuesx[j] = aae.values[j];
63
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1040 }
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1041 if (!updated)
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1042 {
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1043 // Append index/e2 to keysx[]/valuesx[]
84
be2ab491772e Expressions -> Vector!Expression
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 79
diff changeset
1044 valuesx.push(e2);
be2ab491772e Expressions -> Vector!Expression
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 79
diff changeset
1045 keysx = keysx.copy();
be2ab491772e Expressions -> Vector!Expression
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 79
diff changeset
1046 keysx.push(index);
63
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1047 }
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1048 v.value = new AssocArrayLiteralExp(aae.loc, keysx, valuesx);
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1049 v.value.type = aae.type;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1050 }
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1051 else if (se)
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1052 {
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1053 /* Create new string literal reflecting updated elem
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1054 */
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1055 int elemi = cast(int)index.toInteger();
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1056 char* s;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1057 s = cast(char*)calloc(se.len + 1, se.sz);
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1058 memcpy(s, se.string_, se.len * se.sz);
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1059 dchar value = cast(dchar)e2.toInteger();
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1060 switch (se.sz)
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1061 {
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1062 case 1: s[elemi] = cast(char)value; break;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1063 case 2: (cast(wchar*)s)[elemi] = cast(wchar)value; break;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1064 case 4: (cast(dchar*)s)[elemi] = value; break;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1065 default:
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1066 assert(0);
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1067 break;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1068 }
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1069 StringExp se2 = new StringExp(se.loc, assumeUnique(s[0..se.len]));
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1070 se2.committed = se.committed;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1071 se2.postfix = se.postfix;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1072 se2.type = se.type;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1073 v.value = se2;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1074 }
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1075 else
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1076 assert(0);
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1077
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1078 e = Cast(type, type, post ? ev : e2);
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1079 }
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1080
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1081 /* Assignment to struct element in array, of the form:
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1082 * a[i].var = e2
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1083 */
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1084 else if (e1.op == TOKdotvar && aggregate.op == TOKindex &&
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1085 (cast(IndexExp)aggregate).e1.op == TOKvar)
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1086 {
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1087 IndexExp ie = cast(IndexExp)aggregate;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1088 VarExp ve = cast(VarExp)(ie.e1);
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1089 VarDeclaration v = ve.var.isVarDeclaration();
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1090 if (!v || v.isDataseg())
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1091 {
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1092 error("%s cannot be modified at compile time", v ? v.toChars(): "void");
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1093 return EXP_CANT_INTERPRET;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1094 }
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1095 Type t = ve.type.toBasetype();
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1096 ArrayLiteralExp ae = cast(ArrayLiteralExp)v.value;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1097 if (!ae)
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1098 {
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1099 // assignment to one element in an uninitialized (static) array.
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1100 // This is quite difficult, because defaultInit() for a struct is a VarExp,
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1101 // not a StructLiteralExp.
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1102 Type t2 = v.type.toBasetype();
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1103 if (t2.ty != Tsarray)
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1104 {
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1105 error("Cannot index an uninitialized variable");
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1106 return EXP_CANT_INTERPRET;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1107 }
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1108
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1109 Type telem = (cast(TypeSArray)t2).nextOf().toBasetype();
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1110 if (telem.ty != Tstruct) { return EXP_CANT_INTERPRET; }
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1111
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1112 // Create a default struct literal...
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1113 StructDeclaration sym = (cast(TypeStruct)telem).sym;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1114 StructLiteralExp structinit = createDefaultInitStructLiteral(v.loc, sym);
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1115
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1116 // ... and use to create a blank array literal
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1117 size_t dim = cast(size_t)(cast(TypeSArray)t2).dim.toInteger();
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1118 ae = createBlockDuplicatedArrayLiteral(v.type, structinit, dim);
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1119 v.value = ae;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1120 }
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1121 if (cast(Expression)(ae.elements) is EXP_CANT_INTERPRET)
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1122 {
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1123 // Note that this would be a runtime segfault
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1124 error("Cannot index null array %s", v.toChars());
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1125 return EXP_CANT_INTERPRET;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1126 }
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1127 // Set the $ variable
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1128 Expression ee = ArrayLength(Type.tsize_t, v.value);
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1129 if (ee !is EXP_CANT_INTERPRET && ie.lengthVar)
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1130 ie.lengthVar.value = ee;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1131 // Determine the index, and check that it's OK.
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1132 Expression index = ie.e2.interpret(istate);
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1133 if (index is EXP_CANT_INTERPRET)
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1134 return EXP_CANT_INTERPRET;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1135
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1136 int elemi = cast(int)index.toInteger();
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1137 if (elemi >= ae.elements.dim)
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1138 {
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1139 error("array index %d is out of bounds %s[0..%d]", elemi,
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1140 v.toChars(), ae.elements.dim);
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1141 return EXP_CANT_INTERPRET;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1142 }
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1143 // Get old element
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1144 Expression vie = cast(Expression)(ae.elements.data[elemi]);
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1145 if (vie.op != TOKstructliteral)
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1146 return EXP_CANT_INTERPRET;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1147
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1148 // Work out which field needs to be changed
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1149 StructLiteralExp se = cast(StructLiteralExp)vie;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1150 VarDeclaration vf = (cast(DotVarExp)e1).var.isVarDeclaration();
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1151 if (!vf)
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1152 return EXP_CANT_INTERPRET;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1153
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1154 int fieldi = se.getFieldIndex(type, vf.offset);
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1155 if (fieldi == -1)
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1156 return EXP_CANT_INTERPRET;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1157
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1158 Expression ev = se.getField(type, vf.offset);
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1159 if (fp)
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1160 e2 = (*fp)(type, ev, e2);
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1161 else
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1162 e2 = Cast(type, type, e2);
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1163 if (e2 == EXP_CANT_INTERPRET)
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1164 return e2;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1165
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1166 // Create new struct literal reflecting updated field
84
be2ab491772e Expressions -> Vector!Expression
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 79
diff changeset
1167 auto expsx = changeOneElement(se.elements, fieldi, e2);
63
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1168 Expression newstruct = new StructLiteralExp(se.loc, se.sd, expsx);
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1169
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1170 // Create new array literal reflecting updated struct elem
84
be2ab491772e Expressions -> Vector!Expression
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 79
diff changeset
1171 ae.elements = changeOneElement(ae.elements, elemi, newstruct);
63
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1172 return ae;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1173 }
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1174 /* Slice assignment, initialization of static arrays
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1175 * a[] = e
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1176 */
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1177 else if (e1.op == TOKslice && (cast(SliceExp)e1).e1.op == TOKvar)
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1178 {
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1179 SliceExp sexp = cast(SliceExp)e1;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1180 VarExp ve = cast(VarExp)(sexp.e1);
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1181 VarDeclaration v = ve.var.isVarDeclaration();
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1182 if (!v || v.isDataseg())
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1183 {
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1184 error("%s cannot be modified at compile time", v.toChars());
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1185 return EXP_CANT_INTERPRET;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1186 }
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1187 // Chase down rebinding of out and ref
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1188 if (v.value && v.value.op == TOKvar)
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1189 {
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1190 VarExp ve2 = cast(VarExp)v.value;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1191 if (ve2.var.isSymbolDeclaration())
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1192 {
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1193 // This can happen if v is a struct initialized to
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1194 // 0 using an __initZ SymbolDeclaration from
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1195 // TypeStruct.defaultInit()
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1196 }
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1197 else
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1198 v = ve2.var.isVarDeclaration();
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1199 assert(v);
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1200 }
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1201 /* Set the $ variable
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1202 */
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1203 Expression ee = v.value ? ArrayLength(Type.tsize_t, v.value)
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1204 : EXP_CANT_INTERPRET;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1205 if (ee !is EXP_CANT_INTERPRET && sexp.lengthVar)
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1206 sexp.lengthVar.value = ee;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1207 Expression upper = null;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1208 Expression lower = null;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1209 if (sexp.upr)
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1210 {
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1211 upper = sexp.upr.interpret(istate);
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1212 if (upper is EXP_CANT_INTERPRET)
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1213 return EXP_CANT_INTERPRET;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1214 }
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1215 if (sexp.lwr)
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1216 {
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1217 lower = sexp.lwr.interpret(istate);
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1218 if (lower is EXP_CANT_INTERPRET)
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1219 return EXP_CANT_INTERPRET;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1220 }
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1221 Type t = v.type.toBasetype();
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1222 size_t dim;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1223 if (t.ty == Tsarray)
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1224 dim = cast(size_t)(cast(TypeSArray)t).dim.toInteger();
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1225 else if (t.ty == Tarray)
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1226 {
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1227 if (!v.value || v.value.op == TOKnull)
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1228 {
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1229 error("cannot assign to null array %s", v.toChars());
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1230 return EXP_CANT_INTERPRET;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1231 }
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1232 if (v.value.op == TOKarrayliteral)
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1233 dim = (cast(ArrayLiteralExp)v.value).elements.dim;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1234 else if (v.value.op ==TOKstring)
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1235 {
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1236 error("String slice assignment is not yet supported in CTFE");
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1237 return EXP_CANT_INTERPRET;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1238 }
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1239 }
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1240 else
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1241 {
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1242 error("%s cannot be evaluated at compile time", toChars());
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1243 return EXP_CANT_INTERPRET;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1244 }
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1245 int upperbound = upper ? cast(int)upper.toInteger() : dim;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1246 int lowerbound = lower ? cast(int)lower.toInteger() : 0;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1247
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1248 ArrayLiteralExp existing;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1249 if ((cast(int)lowerbound < 0) || (upperbound > dim))
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1250 {
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1251 error("Array bounds [0..%d] exceeded in slice [%d..%d]", dim, lowerbound, upperbound);
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1252 return EXP_CANT_INTERPRET;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1253 }
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1254 if (upperbound-lowerbound != dim)
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1255 {
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1256 // Only modifying part of the array. Must create a new array literal.
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1257 // If the existing array is uninitialized (this can only happen
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1258 // with static arrays), create it.
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1259 if (v.value && v.value.op == TOKarrayliteral)
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1260 existing = cast(ArrayLiteralExp)v.value;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1261 else
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1262 {
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1263 // this can only happen with static arrays
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1264 existing = createBlockDuplicatedArrayLiteral(v.type, v.type.defaultInit(Loc(0)), dim);
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1265 }
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1266 }
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1267
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1268 if (e2.op == TOKarrayliteral)
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1269 {
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1270 // Static array assignment from literal
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1271 ArrayLiteralExp ae = cast(ArrayLiteralExp)e2;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1272 if (ae.elements.dim != (upperbound - lowerbound))
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1273 {
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1274 error("Array length mismatch assigning [0..%d] to [%d..%d]", ae.elements.dim, lowerbound, upperbound);
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1275 return e;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1276 }
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1277 if (upperbound - lowerbound == dim)
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1278 v.value = ae;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1279 else
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1280 {
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1281 // value[] = value[0..lower] ~ ae ~ value[upper..$]
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1282 existing.elements = spliceElements(existing.elements, ae.elements, lowerbound);
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1283 v.value = existing;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1284 }
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1285 return e2;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1286 }
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1287 else if (t.nextOf().ty == e2.type.ty)
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1288 {
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1289 // Static array block assignment
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1290 if (upperbound-lowerbound ==dim)
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1291 v.value = createBlockDuplicatedArrayLiteral(v.type, e2, dim);
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1292 else
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1293 {
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1294 // value[] = value[0..lower] ~ ae ~ value[upper..$]
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1295 existing.elements = spliceElements(existing.elements, createBlockDuplicatedArrayLiteral(v.type, e2, upperbound-lowerbound).elements, lowerbound);
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1296 v.value = existing;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1297 }
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1298 return e2;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1299 }
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1300 else if (e2.op == TOKstring)
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1301 {
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1302 StringExp se = cast(StringExp)e2;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1303 // This is problematic. char[8] should be storing
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1304 // values as a string literal, not
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1305 // as an array literal. Then, for static arrays, we
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1306 // could do modifications
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1307 // in-place, with a dramatic memory and speed improvement.
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1308 error("String slice assignment is not yet supported in CTFE");
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1309 return e2;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1310 }
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1311 else
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1312 {
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1313 error("Slice operation %s cannot be evaluated at compile time", toChars());
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1314 return e;
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1315 }
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1316 }
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1317 else
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1318 {
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1319 error("%s cannot be evaluated at compile time", toChars());
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1320 version (DEBUG) {
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1321 dump(0);
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1322 }
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1323 }
cab4c37afb89 A bunch of implementations
korDen
parents: 60
diff changeset
1324 return e;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1325 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1326
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 63
diff changeset
1327 override bool canThrow()
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1328 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1329 return e1.canThrow() || e2.canThrow();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1330 }
73
ef02e2e203c2 Updating to dmd2.033
korDen
parents: 72
diff changeset
1331
ef02e2e203c2 Updating to dmd2.033
korDen
parents: 72
diff changeset
1332 // generate an error if this is a nonsensical *=,/=, or %=, eg real *= imaginary
ef02e2e203c2 Updating to dmd2.033
korDen
parents: 72
diff changeset
1333 void checkComplexMulAssign()
ef02e2e203c2 Updating to dmd2.033
korDen
parents: 72
diff changeset
1334 {
ef02e2e203c2 Updating to dmd2.033
korDen
parents: 72
diff changeset
1335 // Any multiplication by an imaginary or complex number yields a complex result.
ef02e2e203c2 Updating to dmd2.033
korDen
parents: 72
diff changeset
1336 // r *= c, i*=c, r*=i, i*=i are all forbidden operations.
ef02e2e203c2 Updating to dmd2.033
korDen
parents: 72
diff changeset
1337 string opstr = Token.toChars(op);
ef02e2e203c2 Updating to dmd2.033
korDen
parents: 72
diff changeset
1338 if ( e1.type.isreal() && e2.type.iscomplex())
ef02e2e203c2 Updating to dmd2.033
korDen
parents: 72
diff changeset
1339 {
ef02e2e203c2 Updating to dmd2.033
korDen
parents: 72
diff changeset
1340 error("%s %s %s is undefined. Did you mean %s %s %s.re ?",
ef02e2e203c2 Updating to dmd2.033
korDen
parents: 72
diff changeset
1341 e1.type.toChars(), opstr, e2.type.toChars(),
ef02e2e203c2 Updating to dmd2.033
korDen
parents: 72
diff changeset
1342 e1.type.toChars(), opstr, e2.type.toChars());
ef02e2e203c2 Updating to dmd2.033
korDen
parents: 72
diff changeset
1343 }
ef02e2e203c2 Updating to dmd2.033
korDen
parents: 72
diff changeset
1344 else if (e1.type.isimaginary() && e2.type.iscomplex())
ef02e2e203c2 Updating to dmd2.033
korDen
parents: 72
diff changeset
1345 {
ef02e2e203c2 Updating to dmd2.033
korDen
parents: 72
diff changeset
1346 error("%s %s %s is undefined. Did you mean %s %s %s.im ?",
ef02e2e203c2 Updating to dmd2.033
korDen
parents: 72
diff changeset
1347 e1.type.toChars(), opstr, e2.type.toChars(),
ef02e2e203c2 Updating to dmd2.033
korDen
parents: 72
diff changeset
1348 e1.type.toChars(), opstr, e2.type.toChars());
ef02e2e203c2 Updating to dmd2.033
korDen
parents: 72
diff changeset
1349 }
ef02e2e203c2 Updating to dmd2.033
korDen
parents: 72
diff changeset
1350 else if ((e1.type.isreal() || e1.type.isimaginary()) && e2.type.isimaginary())
ef02e2e203c2 Updating to dmd2.033
korDen
parents: 72
diff changeset
1351 {
ef02e2e203c2 Updating to dmd2.033
korDen
parents: 72
diff changeset
1352 error("%s %s %s is an undefined operation", e1.type.toChars(),
ef02e2e203c2 Updating to dmd2.033
korDen
parents: 72
diff changeset
1353 opstr, e2.type.toChars());
ef02e2e203c2 Updating to dmd2.033
korDen
parents: 72
diff changeset
1354 }
ef02e2e203c2 Updating to dmd2.033
korDen
parents: 72
diff changeset
1355 }
ef02e2e203c2 Updating to dmd2.033
korDen
parents: 72
diff changeset
1356
ef02e2e203c2 Updating to dmd2.033
korDen
parents: 72
diff changeset
1357 // generate an error if this is a nonsensical += or -=, eg real += imaginary
ef02e2e203c2 Updating to dmd2.033
korDen
parents: 72
diff changeset
1358 void checkComplexAddAssign()
ef02e2e203c2 Updating to dmd2.033
korDen
parents: 72
diff changeset
1359 {
ef02e2e203c2 Updating to dmd2.033
korDen
parents: 72
diff changeset
1360 // Addition or subtraction of a real and an imaginary is a complex result.
ef02e2e203c2 Updating to dmd2.033
korDen
parents: 72
diff changeset
1361 // Thus, r+=i, r+=c, i+=r, i+=c are all forbidden operations.
ef02e2e203c2 Updating to dmd2.033
korDen
parents: 72
diff changeset
1362 if ( (e1.type.isreal() && (e2.type.isimaginary() || e2.type.iscomplex())) ||
ef02e2e203c2 Updating to dmd2.033
korDen
parents: 72
diff changeset
1363 (e1.type.isimaginary() && (e2.type.isreal() || e2.type.iscomplex()))
ef02e2e203c2 Updating to dmd2.033
korDen
parents: 72
diff changeset
1364 )
ef02e2e203c2 Updating to dmd2.033
korDen
parents: 72
diff changeset
1365 {
ef02e2e203c2 Updating to dmd2.033
korDen
parents: 72
diff changeset
1366 error("%s %s %s is undefined (result is complex)",
ef02e2e203c2 Updating to dmd2.033
korDen
parents: 72
diff changeset
1367 e1.type.toChars(), Token.toChars(op), e2.type.toChars());
ef02e2e203c2 Updating to dmd2.033
korDen
parents: 72
diff changeset
1368 }
ef02e2e203c2 Updating to dmd2.033
korDen
parents: 72
diff changeset
1369 }
ef02e2e203c2 Updating to dmd2.033
korDen
parents: 72
diff changeset
1370
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1371
12
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1372 /***********************************
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1373 * Construct the array operation expression.
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1374 */
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1375 Expression arrayOp(Scope sc)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1376 {
12
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1377 //printf("BinExp.arrayOp() %s\n", toChars());
73
ef02e2e203c2 Updating to dmd2.033
korDen
parents: 72
diff changeset
1378
ef02e2e203c2 Updating to dmd2.033
korDen
parents: 72
diff changeset
1379 if (type.toBasetype().nextOf().toBasetype().ty == Tvoid)
ef02e2e203c2 Updating to dmd2.033
korDen
parents: 72
diff changeset
1380 {
ef02e2e203c2 Updating to dmd2.033
korDen
parents: 72
diff changeset
1381 error("Cannot perform array operations on void[] arrays");
ef02e2e203c2 Updating to dmd2.033
korDen
parents: 72
diff changeset
1382 return new ErrorExp();
ef02e2e203c2 Updating to dmd2.033
korDen
parents: 72
diff changeset
1383 }
79
43073c7c7769 updated to 2.035
Trass3r
parents: 74
diff changeset
1384
12
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1385 Expressions arguments = new Expressions();
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1386
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1387 /* The expression to generate an array operation for is mangled
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1388 * into a name to use as the array operation function name.
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1389 * Mangle in the operands and operators in RPN order, and type.
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1390 */
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1391 scope OutBuffer buf = new OutBuffer();
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1392 buf.writestring("_array");
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1393 buildArrayIdent(buf, arguments);
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1394 buf.writeByte('_');
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1395
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1396 /* Append deco of array element type
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1397 */
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1398 version (DMDV2) {
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1399 buf.writestring(type.toBasetype().nextOf().toBasetype().mutableOf().deco);
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1400 } else {
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1401 buf.writestring(type.toBasetype().nextOf().toBasetype().deco);
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1402 }
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1403
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1404 size_t namelen = buf.offset;
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1405 buf.writeByte(0);
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1406 immutable(char)* name = cast(immutable(char)*)buf.extractData();
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1407
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1408 /* Look up name in hash table
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1409 */
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1410 if (arrayfuncs is null) arrayfuncs = new StringTable(); /// HACK!
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1411
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1412 StringValue* sv = arrayfuncs.update(name[0..namelen]);
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1413 FuncDeclaration fd = cast(FuncDeclaration)sv.ptrvalue;
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1414 if (!fd)
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1415 {
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1416 /* Some of the array op functions are written as library functions,
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1417 * presumably to optimize them with special CPU vector instructions.
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1418 * List those library functions here, in alpha order.
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1419 */
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1420 static const(char)*[] libArrayopFuncs =
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1421 [
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1422 "_arrayExpSliceAddass_a",
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1423 "_arrayExpSliceAddass_d", // T[]+=T
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1424 "_arrayExpSliceAddass_f", // T[]+=T
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1425 "_arrayExpSliceAddass_g",
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1426 "_arrayExpSliceAddass_h",
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1427 "_arrayExpSliceAddass_i",
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1428 "_arrayExpSliceAddass_k",
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1429 "_arrayExpSliceAddass_s",
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1430 "_arrayExpSliceAddass_t",
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1431 "_arrayExpSliceAddass_u",
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1432 "_arrayExpSliceAddass_w",
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1433
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1434 "_arrayExpSliceDivass_d", // T[]/=T
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1435 "_arrayExpSliceDivass_f", // T[]/=T
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1436
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1437 "_arrayExpSliceMinSliceAssign_a",
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1438 "_arrayExpSliceMinSliceAssign_d", // T[]=T-T[]
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1439 "_arrayExpSliceMinSliceAssign_f", // T[]=T-T[]
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1440 "_arrayExpSliceMinSliceAssign_g",
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1441 "_arrayExpSliceMinSliceAssign_h",
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1442 "_arrayExpSliceMinSliceAssign_i",
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1443 "_arrayExpSliceMinSliceAssign_k",
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1444 "_arrayExpSliceMinSliceAssign_s",
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1445 "_arrayExpSliceMinSliceAssign_t",
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1446 "_arrayExpSliceMinSliceAssign_u",
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1447 "_arrayExpSliceMinSliceAssign_w",
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1448
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1449 "_arrayExpSliceMinass_a",
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1450 "_arrayExpSliceMinass_d", // T[]-=T
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1451 "_arrayExpSliceMinass_f", // T[]-=T
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1452 "_arrayExpSliceMinass_g",
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1453 "_arrayExpSliceMinass_h",
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1454 "_arrayExpSliceMinass_i",
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1455 "_arrayExpSliceMinass_k",
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1456 "_arrayExpSliceMinass_s",
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1457 "_arrayExpSliceMinass_t",
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1458 "_arrayExpSliceMinass_u",
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1459 "_arrayExpSliceMinass_w",
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1460
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1461 "_arrayExpSliceMulass_d", // T[]*=T
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1462 "_arrayExpSliceMulass_f", // T[]*=T
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1463 "_arrayExpSliceMulass_i",
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1464 "_arrayExpSliceMulass_k",
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1465 "_arrayExpSliceMulass_s",
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1466 "_arrayExpSliceMulass_t",
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1467 "_arrayExpSliceMulass_u",
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1468 "_arrayExpSliceMulass_w",
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1469
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1470 "_arraySliceExpAddSliceAssign_a",
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1471 "_arraySliceExpAddSliceAssign_d", // T[]=T[]+T
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1472 "_arraySliceExpAddSliceAssign_f", // T[]=T[]+T
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1473 "_arraySliceExpAddSliceAssign_g",
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1474 "_arraySliceExpAddSliceAssign_h",
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1475 "_arraySliceExpAddSliceAssign_i",
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1476 "_arraySliceExpAddSliceAssign_k",
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1477 "_arraySliceExpAddSliceAssign_s",
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1478 "_arraySliceExpAddSliceAssign_t",
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1479 "_arraySliceExpAddSliceAssign_u",
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1480 "_arraySliceExpAddSliceAssign_w",
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1481
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1482 "_arraySliceExpDivSliceAssign_d", // T[]=T[]/T
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1483 "_arraySliceExpDivSliceAssign_f", // T[]=T[]/T
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1484
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1485 "_arraySliceExpMinSliceAssign_a",
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1486 "_arraySliceExpMinSliceAssign_d", // T[]=T[]-T
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1487 "_arraySliceExpMinSliceAssign_f", // T[]=T[]-T
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1488 "_arraySliceExpMinSliceAssign_g",
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1489 "_arraySliceExpMinSliceAssign_h",
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1490 "_arraySliceExpMinSliceAssign_i",
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1491 "_arraySliceExpMinSliceAssign_k",
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1492 "_arraySliceExpMinSliceAssign_s",
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1493 "_arraySliceExpMinSliceAssign_t",
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1494 "_arraySliceExpMinSliceAssign_u",
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1495 "_arraySliceExpMinSliceAssign_w",
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1496
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1497 "_arraySliceExpMulSliceAddass_d", // T[] += T[]*T
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1498 "_arraySliceExpMulSliceAddass_f",
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1499 "_arraySliceExpMulSliceAddass_r",
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1500
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1501 "_arraySliceExpMulSliceAssign_d", // T[]=T[]*T
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1502 "_arraySliceExpMulSliceAssign_f", // T[]=T[]*T
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1503 "_arraySliceExpMulSliceAssign_i",
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1504 "_arraySliceExpMulSliceAssign_k",
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1505 "_arraySliceExpMulSliceAssign_s",
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1506 "_arraySliceExpMulSliceAssign_t",
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1507 "_arraySliceExpMulSliceAssign_u",
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1508 "_arraySliceExpMulSliceAssign_w",
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1509
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1510 "_arraySliceExpMulSliceMinass_d", // T[] -= T[]*T
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1511 "_arraySliceExpMulSliceMinass_f",
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1512 "_arraySliceExpMulSliceMinass_r",
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1513
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1514 "_arraySliceSliceAddSliceAssign_a",
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1515 "_arraySliceSliceAddSliceAssign_d", // T[]=T[]+T[]
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1516 "_arraySliceSliceAddSliceAssign_f", // T[]=T[]+T[]
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1517 "_arraySliceSliceAddSliceAssign_g",
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1518 "_arraySliceSliceAddSliceAssign_h",
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1519 "_arraySliceSliceAddSliceAssign_i",
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1520 "_arraySliceSliceAddSliceAssign_k",
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1521 "_arraySliceSliceAddSliceAssign_r", // T[]=T[]+T[]
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1522 "_arraySliceSliceAddSliceAssign_s",
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1523 "_arraySliceSliceAddSliceAssign_t",
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1524 "_arraySliceSliceAddSliceAssign_u",
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1525 "_arraySliceSliceAddSliceAssign_w",
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1526
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1527 "_arraySliceSliceAddass_a",
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1528 "_arraySliceSliceAddass_d", // T[]+=T[]
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1529 "_arraySliceSliceAddass_f", // T[]+=T[]
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1530 "_arraySliceSliceAddass_g",
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1531 "_arraySliceSliceAddass_h",
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1532 "_arraySliceSliceAddass_i",
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1533 "_arraySliceSliceAddass_k",
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1534 "_arraySliceSliceAddass_s",
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1535 "_arraySliceSliceAddass_t",
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1536 "_arraySliceSliceAddass_u",
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1537 "_arraySliceSliceAddass_w",
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1538
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1539 "_arraySliceSliceMinSliceAssign_a",
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1540 "_arraySliceSliceMinSliceAssign_d", // T[]=T[]-T[]
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1541 "_arraySliceSliceMinSliceAssign_f", // T[]=T[]-T[]
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1542 "_arraySliceSliceMinSliceAssign_g",
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1543 "_arraySliceSliceMinSliceAssign_h",
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1544 "_arraySliceSliceMinSliceAssign_i",
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1545 "_arraySliceSliceMinSliceAssign_k",
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1546 "_arraySliceSliceMinSliceAssign_r", // T[]=T[]-T[]
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1547 "_arraySliceSliceMinSliceAssign_s",
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1548 "_arraySliceSliceMinSliceAssign_t",
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1549 "_arraySliceSliceMinSliceAssign_u",
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1550 "_arraySliceSliceMinSliceAssign_w",
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1551
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1552 "_arraySliceSliceMinass_a",
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1553 "_arraySliceSliceMinass_d", // T[]-=T[]
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1554 "_arraySliceSliceMinass_f", // T[]-=T[]
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1555 "_arraySliceSliceMinass_g",
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1556 "_arraySliceSliceMinass_h",
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1557 "_arraySliceSliceMinass_i",
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1558 "_arraySliceSliceMinass_k",
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1559 "_arraySliceSliceMinass_s",
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1560 "_arraySliceSliceMinass_t",
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1561 "_arraySliceSliceMinass_u",
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1562 "_arraySliceSliceMinass_w",
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1563
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1564 "_arraySliceSliceMulSliceAssign_d", // T[]=T[]*T[]
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1565 "_arraySliceSliceMulSliceAssign_f", // T[]=T[]*T[]
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1566 "_arraySliceSliceMulSliceAssign_i",
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1567 "_arraySliceSliceMulSliceAssign_k",
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1568 "_arraySliceSliceMulSliceAssign_s",
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1569 "_arraySliceSliceMulSliceAssign_t",
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1570 "_arraySliceSliceMulSliceAssign_u",
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1571 "_arraySliceSliceMulSliceAssign_w",
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1572
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1573 "_arraySliceSliceMulass_d", // T[]*=T[]
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1574 "_arraySliceSliceMulass_f", // T[]*=T[]
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1575 "_arraySliceSliceMulass_i",
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1576 "_arraySliceSliceMulass_k",
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1577 "_arraySliceSliceMulass_s",
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1578 "_arraySliceSliceMulass_t",
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1579 "_arraySliceSliceMulass_u",
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1580 "_arraySliceSliceMulass_w",
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1581 ];
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1582
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1583 int i = binary(name, libArrayopFuncs.ptr, libArrayopFuncs.length);
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1584 if (i == -1)
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1585 {
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1586 debug { // Make sure our array is alphabetized
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1587 for (i = 0; i < libArrayopFuncs.length; i++)
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1588 {
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1589 if (strcmp(name, libArrayopFuncs[i]) == 0)
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1590 assert(false);
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1591 }
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1592 }
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1593 /* Not in library, so generate it.
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1594 * Construct the function body:
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1595 * foreach (i; 0 .. p.length) for (size_t i = 0; i < p.length; i++)
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1596 * loopbody;
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1597 * return p;
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1598 */
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1599
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1600 Arguments fparams = new Arguments();
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1601 Expression loopbody = buildArrayLoop(fparams);
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1602 Argument p = cast(Argument)fparams.data[0 /*fparams.dim - 1*/];
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1603 version (DMDV1) {
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1604 // for (size_t i = 0; i < p.length; i++)
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1605 Initializer init = new ExpInitializer(0, new IntegerExp(0, 0, Type.tsize_t));
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1606 Dsymbol d = new VarDeclaration(0, Type.tsize_t, Id.p, init);
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1607 Statement s1 = new ForStatement(0,
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1608 new DeclarationStatement(0, d),
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1609 new CmpExp(TOKlt, 0, new IdentifierExp(0, Id.p), new ArrayLengthExp(0, new IdentifierExp(0, p.ident))),
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1610 new PostExp(TOKplusplus, 0, new IdentifierExp(0, Id.p)),
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1611 new ExpStatement(0, loopbody));
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1612 } else {
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1613 // foreach (i; 0 .. p.length)
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1614 Statement s1 = new ForeachRangeStatement(Loc(0), TOKforeach,
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1615 new Argument(STC.STCundefined, null, Id.p, null),
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1616 new IntegerExp(Loc(0), 0, Type.tint32),
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1617 new ArrayLengthExp(Loc(0), new IdentifierExp(Loc(0), p.ident)),
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1618 new ExpStatement(Loc(0), loopbody));
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1619 }
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1620 Statement s2 = new ReturnStatement(Loc(0), new IdentifierExp(Loc(0), p.ident));
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1621 //printf("s2: %s\n", s2.toChars());
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1622 Statement fbody = new CompoundStatement(Loc(0), s1, s2);
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1623
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1624 /* Construct the function
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1625 */
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1626 TypeFunction ftype = new TypeFunction(fparams, type, 0, LINKc);
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1627 //printf("ftype: %s\n", ftype.toChars());
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1628 fd = new FuncDeclaration(Loc(0), Loc(0), Lexer.idPool(name[0..namelen]), STCundefined, ftype);
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1629 fd.fbody = fbody;
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1630 fd.protection = PROT.PROTpublic;
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1631 fd.linkage = LINKc;
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1632
74
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 73
diff changeset
1633 sc.module_.importedFrom.members.push(fd);
12
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1634
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1635 sc = sc.push();
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1636 sc.parent = sc.module_.importedFrom;
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1637 sc.stc = STCundefined;
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1638 sc.linkage = LINKc;
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1639 fd.semantic(sc);
79
43073c7c7769 updated to 2.035
Trass3r
parents: 74
diff changeset
1640 fd.semantic2(sc);
43073c7c7769 updated to 2.035
Trass3r
parents: 74
diff changeset
1641 fd.semantic3(sc);
12
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1642 sc.pop();
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1643 }
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1644 else
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1645 { /* In library, refer to it.
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1646 */
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1647 fd = FuncDeclaration.genCfunc(type, name[0..namelen]);
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1648 }
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1649 sv.ptrvalue = cast(void*)fd; // cache symbol in hash table
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1650 }
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1651
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1652 /* Call the function fd(arguments)
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1653 */
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1654 Expression ec = new VarExp(Loc(0), fd);
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1655 Expression e = new CallExp(loc, ec, arguments);
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1656 e.type = type;
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1657 return e;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1658 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1659
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 63
diff changeset
1660 override int inlineCost(InlineCostState* ics)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1661 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1662 return 1 + e1.inlineCost(ics) + e2.inlineCost(ics);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1663 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1664
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 63
diff changeset
1665 override Expression doInline(InlineDoState ids)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1666 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1667 BinExp be = cast(BinExp)copy();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1668
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1669 be.e1 = e1.doInline(ids);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1670 be.e2 = e2.doInline(ids);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1671 return be;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1672 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1673
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 63
diff changeset
1674 override Expression inlineScan(InlineScanState* iss)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1675 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1676 e1 = e1.inlineScan(iss);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1677 e2 = e2.inlineScan(iss);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1678 return this;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1679 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1680
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1681 Expression op_overload(Scope sc)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1682 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1683 //printf("BinExp.op_overload() (%s)\n", toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1684
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1685 AggregateDeclaration ad;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1686 Type t1 = e1.type.toBasetype();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1687 Type t2 = e2.type.toBasetype();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1688 Identifier id = opId();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1689 Identifier id_r = opId_r();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1690
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1691 Match m;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1692 scope Expressions args1 = new Expressions();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1693 scope Expressions args2 = new Expressions();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1694 int argsset = 0;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1695
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1696 AggregateDeclaration ad1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1697 if (t1.ty == TY.Tclass)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1698 ad1 = (cast(TypeClass)t1).sym;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1699 else if (t1.ty == TY.Tstruct)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1700 ad1 = (cast(TypeStruct)t1).sym;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1701 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1702 ad1 = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1703
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1704 AggregateDeclaration ad2;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1705 if (t2.ty == TY.Tclass)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1706 ad2 = (cast(TypeClass)t2).sym;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1707 else if (t2.ty == TY.Tstruct)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1708 ad2 = (cast(TypeStruct)t2).sym;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1709 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1710 ad2 = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1711
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1712 Dsymbol s = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1713 Dsymbol s_r = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1714 FuncDeclaration fd = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1715 TemplateDeclaration td = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1716 if (ad1 && id)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1717 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1718 s = search_function(ad1, id);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1719 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1720 if (ad2 && id_r)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1721 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1722 s_r = search_function(ad2, id_r);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1723 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1724
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1725 if (s || s_r)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1726 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1727 /* Try:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1728 * a.opfunc(b)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1729 * b.opfunc_r(a)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1730 * and see which is better.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1731 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1732 Expression e;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1733 FuncDeclaration lastf;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1734
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1735 args1.setDim(1);
84
be2ab491772e Expressions -> Vector!Expression
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 79
diff changeset
1736 args1[0] = e1;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1737 args2.setDim(1);
84
be2ab491772e Expressions -> Vector!Expression
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 79
diff changeset
1738 args2[0] = e2;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1739 argsset = 1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1740
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1741 ///memset(&m, 0, sizeof(m));
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1742 m.last = MATCH.MATCHnomatch;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1743
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1744 if (s)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1745 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1746 fd = s.isFuncDeclaration();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1747 if (fd)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1748 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1749 overloadResolveX(&m, fd, null, args2);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1750 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1751 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1752 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1753 td = s.isTemplateDeclaration();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1754 templateResolve(&m, td, sc, loc, null, null, args2);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1755 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1756 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1757
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1758 lastf = m.lastf;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1759
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1760 if (s_r)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1761 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1762 fd = s_r.isFuncDeclaration();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1763 if (fd)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1764 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1765 overloadResolveX(&m, fd, null, args1);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1766 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1767 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1768 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1769 td = s_r.isTemplateDeclaration();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1770 templateResolve(&m, td, sc, loc, null, null, args1);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1771 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1772 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1773
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1774 if (m.count > 1)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1775 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1776 // Error, ambiguous
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1777 error("overloads %s and %s both match argument list for %s",
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1778 m.lastf.type.toChars(),
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1779 m.nextf.type.toChars(),
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1780 m.lastf.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1781 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1782 else if (m.last == MATCH.MATCHnomatch)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1783 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1784 m.lastf = m.anyf;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1785 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1786
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1787 if (op == TOK.TOKplusplus || op == TOK.TOKminusminus)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1788 // Kludge because operator overloading regards e++ and e--
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1789 // as unary, but it's implemented as a binary.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1790 // Rewrite (e1 ++ e2) as e1.postinc()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1791 // Rewrite (e1 -- e2) as e1.postdec()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1792 e = build_overload(loc, sc, e1, null, id);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1793 else if (lastf && m.lastf == lastf || m.last == MATCH.MATCHnomatch)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1794 // Rewrite (e1 op e2) as e1.opfunc(e2)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1795 e = build_overload(loc, sc, e1, e2, id);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1796 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1797 // Rewrite (e1 op e2) as e2.opfunc_r(e1)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1798 e = build_overload(loc, sc, e2, e1, id_r);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1799 return e;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1800 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1801
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1802 if (isCommutative())
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1803 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1804 s = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1805 s_r = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1806 if (ad1 && id_r)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1807 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1808 s_r = search_function(ad1, id_r);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1809 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1810 if (ad2 && id)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1811 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1812 s = search_function(ad2, id);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1813 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1814
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1815 if (s || s_r)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1816 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1817 /* Try:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1818 * a.opfunc_r(b)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1819 * b.opfunc(a)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1820 * and see which is better.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1821 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1822
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1823 if (!argsset)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1824 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1825 args1.setDim(1);
84
be2ab491772e Expressions -> Vector!Expression
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 79
diff changeset
1826 args1[0] = e1;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1827 args2.setDim(1);
84
be2ab491772e Expressions -> Vector!Expression
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 79
diff changeset
1828 args2[0] = e2;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1829 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1830
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1831 ///memset(&m, 0, sizeof(m));
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1832 m.last = MATCH.MATCHnomatch;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1833
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1834 if (s_r)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1835 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1836 fd = s_r.isFuncDeclaration();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1837 if (fd)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1838 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1839 overloadResolveX(&m, fd, null, args2);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1840 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1841 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1842 { td = s_r.isTemplateDeclaration();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1843 templateResolve(&m, td, sc, loc, null, null, args2);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1844 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1845 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1846 FuncDeclaration lastf = m.lastf;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1847
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1848 if (s)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1849 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1850 fd = s.isFuncDeclaration();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1851 if (fd)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1852 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1853 overloadResolveX(&m, fd, null, args1);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1854 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1855 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1856 { td = s.isTemplateDeclaration();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1857 templateResolve(&m, td, sc, loc, null, null, args1);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1858 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1859 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1860
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1861 if (m.count > 1)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1862 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1863 // Error, ambiguous
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1864 error("overloads %s and %s both match argument list for %s",
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1865 m.lastf.type.toChars(),
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1866 m.nextf.type.toChars(),
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1867 m.lastf.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1868 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1869 else if (m.last == MATCH.MATCHnomatch)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1870 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1871 m.lastf = m.anyf;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1872 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1873
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1874 Expression e;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1875 if (lastf && m.lastf == lastf || id_r && m.last == MATCH.MATCHnomatch)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1876 // Rewrite (e1 op e2) as e1.opfunc_r(e2)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1877 e = build_overload(loc, sc, e1, e2, id_r);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1878 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1879 // Rewrite (e1 op e2) as e2.opfunc(e1)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1880 e = build_overload(loc, sc, e2, e1, id);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1881
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1882 // When reversing operands of comparison operators,
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1883 // need to reverse the sense of the op
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1884 switch (op)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1885 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1886 case TOK.TOKlt: op = TOK.TOKgt; break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1887 case TOK.TOKgt: op = TOK.TOKlt; break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1888 case TOK.TOKle: op = TOK.TOKge; break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1889 case TOK.TOKge: op = TOK.TOKle; break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1890
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1891 // Floating point compares
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1892 case TOK.TOKule: op = TOK.TOKuge; break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1893 case TOK.TOKul: op = TOK.TOKug; break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1894 case TOK.TOKuge: op = TOK.TOKule; break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1895 case TOK.TOKug: op = TOK.TOKul; break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1896
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1897 // These are symmetric
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1898 case TOK.TOKunord:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1899 case TOK.TOKlg:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1900 case TOK.TOKleg:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1901 case TOK.TOKue:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1902 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1903 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1904
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1905 return e;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1906 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1907 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1908
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1909 version (DMDV2) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1910 // Try alias this on first operand
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1911 if (ad1 && ad1.aliasthis)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1912 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1913 /* Rewrite (e1 op e2) as:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1914 * (e1.aliasthis op e2)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1915 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1916 Expression e1 = new DotIdExp(loc, this.e1, ad1.aliasthis.ident);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1917 Expression e = copy();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1918 (cast(BinExp)e).e1 = e1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1919 e = e.semantic(sc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1920 return e;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1921 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1922
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1923 // Try alias this on second operand
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1924 if (ad2 && ad2.aliasthis)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1925 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1926 /* Rewrite (e1 op e2) as:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1927 * (e1 op e2.aliasthis)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1928 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1929 Expression e2 = new DotIdExp(loc, this.e2, ad2.aliasthis.ident);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1930 Expression e = copy();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1931 (cast(BinExp)e).e2 = e2;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1932 e = e.semantic(sc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1933 return e;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1934 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1935 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1936 return null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1937 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1938
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1939 elem* toElemBin(IRState* irs, int op)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1940 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1941 //printf("toElemBin() '%s'\n", toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1942
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1943 tym_t tym = type.totym();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1944
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1945 elem* el = e1.toElem(irs);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1946 elem* er = e2.toElem(irs);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1947 elem* e = el_bin(op,tym,el,er);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1948 el_setLoc(e,loc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1949
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1950 return e;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1951 }
12
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1952
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1953 final void Exp_buildArrayIdent(OutBuffer buf, Expressions arguments, string Str)
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1954 {
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1955 /* Evaluate assign expressions left to right
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1956 */
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1957 e1.buildArrayIdent(buf, arguments);
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1958 e2.buildArrayIdent(buf, arguments);
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1959 buf.writestring(Str);
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1960 }
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1961
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1962 final void AssignExp_buildArrayIdent(OutBuffer buf, Expressions arguments, string Str)
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1963 {
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1964 /* Evaluate assign expressions right to left
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1965 */
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1966 e2.buildArrayIdent(buf, arguments);
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1967 e1.buildArrayIdent(buf, arguments);
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1968 buf.writestring(Str);
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1969 buf.writestring("ass");
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
1970 }
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 63
diff changeset
1971 }