annotate dmd/BinExp.d @ 179:cd48cb899aee

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