annotate dmd/BinExp.d @ 154:14feb7ae01a6

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