annotate dmd/BinExp.d @ 126:1765f3ef917d

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