annotate dmd/AssignExp.d @ 178:e3afd1303184

Many small bugs fixed Made all classes derive from TObject to detect memory leaks (functionality is disabled for now) Began work on overriding backend memory allocations (to avoid memory leaks)
author korDen
date Sun, 17 Oct 2010 07:42:00 +0400
parents 60bb0fe4563e
children b0d41ff5e0df
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
1 module dmd.AssignExp;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
2
114
e28b18c23469 added a module dmd.common for commonly used stuff
Trass3r
parents: 90
diff changeset
3 import dmd.common;
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
4 import dmd.Expression;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
5 import dmd.Identifier;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
6 import dmd.backend.elem;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
7 import dmd.InterState;
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 126
diff changeset
8 import dmd.Parameter;
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
9 import dmd.IndexExp;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
10 import dmd.CallExp;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
11 import dmd.CastExp;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
12 import dmd.TypeSArray;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
13 import dmd.StructLiteralExp;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
14 import dmd.ArrayLengthExp;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
15 import dmd.TypeStruct;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
16 import dmd.StructDeclaration;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
17 import dmd.VarExp;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
18 import dmd.TY;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
19 import dmd.SliceExp;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
20 import dmd.CommaExp;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
21 import dmd.ArrayExp;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
22 import dmd.AggregateDeclaration;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
23 import dmd.CondExp;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
24 import dmd.DotVarExp;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
25 import dmd.WANT;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
26 import dmd.Id;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
27 import dmd.TypeClass;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
28 import dmd.OutBuffer;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
29 import dmd.Loc;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
30 import dmd.TypeNext;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
31 import dmd.TupleExp;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
32 import dmd.VarDeclaration;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
33 import dmd.Scope;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
34 import dmd.IRState;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
35 import dmd.ArrayTypes;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
36 import dmd.BinExp;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
37 import dmd.TOK;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
38 import dmd.Global;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
39 import dmd.Declaration;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
40 import dmd.TypeFunction;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
41 import dmd.Type;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
42 import dmd.RET;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
43 import dmd.STC;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
44 import dmd.DotIdExp;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
45
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
46 import dmd.backend.Util;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
47 import dmd.backend.Symbol;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
48 import dmd.backend.OPER;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
49 import dmd.backend.TYM;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
50 import dmd.backend.RTLSYM;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
51 import dmd.codegen.Util;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
52 import dmd.expression.Util;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
53
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
54 class AssignExp : BinExp
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
55 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
56 int ismemset = 0;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
57
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
58 this(Loc loc, Expression e1, Expression e2)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
59 {
178
e3afd1303184 Many small bugs fixed
korDen
parents: 130
diff changeset
60 register();
e3afd1303184 Many small bugs fixed
korDen
parents: 130
diff changeset
61
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
62 super(loc, TOK.TOKassign, AssignExp.sizeof, e1, e2);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
63 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
64
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
65 override Expression semantic(Scope sc)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
66 {
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
67 Expression e1old = e1;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
68
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
69 version (LOGSEMANTIC) {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
70 printf("AssignExp.semantic('%s')\n", toChars());
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
71 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
72 //printf("e1.op = %d, '%s'\n", e1.op, Token.toChars(e1.op));
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
73 //printf("e2.op = %d, '%s'\n", e2.op, Token.toChars(e2.op));
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
74
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
75 if (type)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
76 return this;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
77
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
78 if (e2.op == TOK.TOKcomma)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
79 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
80 /* Rewrite to get rid of the comma from rvalue
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
81 */
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
82 AssignExp ea = new AssignExp(loc, e1, (cast(CommaExp)e2).e2);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
83 ea.op = op;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
84 Expression e = new CommaExp(loc, (cast(CommaExp)e2).e1, ea);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
85 return e.semantic(sc);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
86 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
87
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
88 /* Look for operator overloading of a[i]=value.
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
89 * Do it before semantic() otherwise the a[i] will have been
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
90 * converted to a.opIndex() already.
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
91 */
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
92 if (e1.op == TOK.TOKarray)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
93 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
94 ArrayExp ae = cast(ArrayExp)e1;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
95 AggregateDeclaration ad;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
96 Identifier id = Id.index;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
97
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
98 ae.e1 = ae.e1.semantic(sc);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
99 Type t1 = ae.e1.type.toBasetype();
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
100 if (t1.ty == TY.Tstruct)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
101 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
102 ad = (cast(TypeStruct)t1).sym;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
103 goto L1;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
104 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
105 else if (t1.ty == TY.Tclass)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
106 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
107 ad = (cast(TypeClass)t1).sym;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
108 L1:
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
109 // Rewrite (a[i] = value) to (a.opIndexAssign(value, i))
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
110 if (search_function(ad, Id.indexass))
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
111 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
112 Expression e = new DotIdExp(loc, ae.e1, Id.indexass);
84
be2ab491772e Expressions -> Vector!Expression
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 72
diff changeset
113 auto a = ae.arguments.copy();
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
114
84
be2ab491772e Expressions -> Vector!Expression
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 72
diff changeset
115 a.insert(0, e2);
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
116 e = new CallExp(loc, e, a);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
117 e = e.semantic(sc);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
118 return e;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
119 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
120 else
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
121 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
122 // Rewrite (a[i] = value) to (a.opIndex(i, value))
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
123 if (search_function(ad, id))
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
124 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
125 Expression e = new DotIdExp(loc, ae.e1, id);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
126
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
127 if (1 || !global.params.useDeprecated)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
128 error("operator [] assignment overload with opIndex(i, value) illegal, use opIndexAssign(value, i)");
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
129
90
39648eb578f6 more Expressions work
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 84
diff changeset
130 e = new CallExp(loc, e, ae.arguments[0], e2);
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
131 e = e.semantic(sc);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
132 return e;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
133 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
134 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
135 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
136 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
137 /* Look for operator overloading of a[i..j]=value.
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
138 * Do it before semantic() otherwise the a[i..j] will have been
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
139 * converted to a.opSlice() already.
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
140 */
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
141 if (e1.op == TOK.TOKslice)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
142 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
143 Type t1;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
144 SliceExp ae = cast(SliceExp)e1;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
145 AggregateDeclaration ad;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
146 Identifier id = Id.index;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
147
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
148 ae.e1 = ae.e1.semantic(sc);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
149 ae.e1 = resolveProperties(sc, ae.e1);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
150 t1 = ae.e1.type.toBasetype();
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
151 if (t1.ty == TY.Tstruct)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
152 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
153 ad = (cast(TypeStruct)t1).sym;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
154 goto L2;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
155 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
156 else if (t1.ty == TY.Tclass)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
157 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
158 ad = (cast(TypeClass)t1).sym;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
159 L2:
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
160 // Rewrite (a[i..j] = value) to (a.opIndexAssign(value, i, j))
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
161 if (search_function(ad, Id.sliceass))
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
162 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
163 Expression e = new DotIdExp(loc, ae.e1, Id.sliceass);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
164 Expressions a = new Expressions();
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
165
84
be2ab491772e Expressions -> Vector!Expression
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 72
diff changeset
166 a.push(e2);
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
167 if (ae.lwr)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
168 {
84
be2ab491772e Expressions -> Vector!Expression
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 72
diff changeset
169 a.push(ae.lwr);
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
170 assert(ae.upr);
84
be2ab491772e Expressions -> Vector!Expression
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 72
diff changeset
171 a.push(ae.upr);
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
172 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
173 else
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
174 assert(!ae.upr);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
175
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
176 e = new CallExp(loc, e, a);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
177 e = e.semantic(sc);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
178 return e;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
179 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
180 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
181 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
182
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
183 BinExp.semantic(sc);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
184
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
185 if (e1.op == TOK.TOKdottd)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
186 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
187 // Rewrite a.b=e2, when b is a template, as a.b(e2)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
188 Expression e = new CallExp(loc, e1, e2);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
189 e = e.semantic(sc);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
190 return e;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
191 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
192
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
193 e2 = resolveProperties(sc, e2);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
194 assert(e1.type);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
195
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
196 /* Rewrite tuple assignment as a tuple of assignments.
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
197 */
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
198 if (e1.op == TOK.TOKtuple && e2.op == TOK.TOKtuple)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
199 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
200 TupleExp tup1 = cast(TupleExp)e1;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
201 TupleExp tup2 = cast(TupleExp)e2;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
202 size_t dim = tup1.exps.dim;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
203 if (dim != tup2.exps.dim)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
204 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
205 error("mismatched tuple lengths, %d and %d", cast(int)dim, cast(int)tup2.exps.dim);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
206 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
207 else
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
208 {
84
be2ab491772e Expressions -> Vector!Expression
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 72
diff changeset
209 auto exps = new Expressions;
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
210 exps.setDim(dim);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
211
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
212 for (int i = 0; i < dim; i++)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
213 {
84
be2ab491772e Expressions -> Vector!Expression
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 72
diff changeset
214 auto ex1 = tup1.exps[i];
be2ab491772e Expressions -> Vector!Expression
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 72
diff changeset
215 auto ex2 = tup2.exps[i];
be2ab491772e Expressions -> Vector!Expression
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 72
diff changeset
216 exps[i] = new AssignExp(loc, ex1, ex2);
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
217 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
218 Expression e = new TupleExp(loc, exps);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
219 e = e.semantic(sc);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
220 return e;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
221 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
222 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
223
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
224 // Determine if this is an initialization of a reference
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
225 int refinit = 0;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
226 if (op == TOK.TOKconstruct && e1.op == TOK.TOKvar)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
227 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
228 VarExp ve = cast(VarExp)e1;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
229 VarDeclaration v = ve.var.isVarDeclaration();
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
230 if (v.storage_class & (STC.STCout | STC.STCref))
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
231 refinit = 1;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
232 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
233
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
234 Type t1 = e1.type.toBasetype();
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
235
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
236 if (t1.ty == TY.Tfunction)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
237 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
238 // Rewrite f=value to f(value)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
239 Expression e = new CallExp(loc, e1, e2);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
240 e = e.semantic(sc);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
241 return e;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
242 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
243
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
244 /* If it is an assignment from a 'foreign' type,
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
245 * check for operator overloading.
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
246 */
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
247 if (t1.ty == TY.Tstruct)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
248 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
249 StructDeclaration sd = (cast(TypeStruct)t1).sym;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
250 if (op == TOK.TOKassign)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
251 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
252 Expression e = op_overload(sc);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
253 if (e)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
254 return e;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
255 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
256 else if (op == TOK.TOKconstruct && !refinit)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
257 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
258 Type t2 = e2.type.toBasetype();
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
259 if (t2.ty == TY.Tstruct && sd == (cast(TypeStruct)t2).sym && sd.cpctor)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
260 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
261 /* We have a copy constructor for this
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
262 */
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
263 if (e2.op == TOK.TOKquestion)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
264 { /* Write as:
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
265 * a ? e1 = b : e1 = c;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
266 */
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
267 CondExp ec = cast(CondExp)e2;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
268 AssignExp ea1 = new AssignExp(ec.e1.loc, e1, ec.e1);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
269 ea1.op = op;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
270 AssignExp ea2 = new AssignExp(ec.e1.loc, e1, ec.e2);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
271 ea2.op = op;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
272 Expression e = new CondExp(loc, ec.econd, ea1, ea2);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
273 return e.semantic(sc);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
274 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
275 else if (e2.op == TOK.TOKvar || e2.op == TOK.TOKdotvar || e2.op == TOK.TOKstar || e2.op == TOK.TOKindex)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
276 { /* Write as:
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
277 * e1.cpctor(e2);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
278 */
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
279 Expression e = new DotVarExp(loc, e1, sd.cpctor, 0);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
280 e = new CallExp(loc, e, e2);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
281 return e.semantic(sc);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
282 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
283 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
284 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
285 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
286 else if (t1.ty == TY.Tclass)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
287 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
288 // Disallow assignment operator overloads for same type
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
289 if (!e2.type.implicitConvTo(e1.type))
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
290 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
291 Expression e = op_overload(sc);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
292 if (e)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
293 return e;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
294 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
295 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
296
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
297 if (t1.ty == TY.Tsarray && !refinit)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
298 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
299 // Convert e1 to e1[]
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
300 Expression e = new SliceExp(e1.loc, e1, null, null);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
301 e1 = e.semantic(sc);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
302 t1 = e1.type.toBasetype();
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
303 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
304
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
305 e2.rvalue();
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
306
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
307 if (e1.op == TOK.TOKarraylength)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
308 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
309 // e1 is not an lvalue, but we let code generator handle it
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
310 ArrayLengthExp ale = cast(ArrayLengthExp)e1;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
311 ale.e1 = ale.e1.modifiableLvalue(sc, e1);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
312 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
313 else if (e1.op == TOK.TOKslice)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
314 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
315 Type tn = e1.type.nextOf();
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
316 if (tn && !tn.isMutable() && op != TOK.TOKconstruct)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
317 error("slice %s is not mutable", e1.toChars());
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
318 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
319 else
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
320 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
321 // Try to do a decent error message with the expression
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
322 // before it got constant folded
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
323 if (e1.op != TOK.TOKvar)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
324 e1 = e1.optimize(WANT.WANTvalue);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
325
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
326 if (op != TOK.TOKconstruct)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
327 e1 = e1.modifiableLvalue(sc, e1old);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
328 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
329
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
330 Type t2 = e2.type;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
331 if (e1.op == TOK.TOKslice && t1.nextOf() && e2.implicitConvTo(t1.nextOf()))
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
332 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
333 // memset
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
334 ismemset = 1; // make it easy for back end to tell what this is
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
335 e2 = e2.implicitCastTo(sc, t1.nextOf());
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
336 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
337 else if (t1.ty == TY.Tsarray)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
338 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
339 /* Should have already converted e1 => e1[]
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
340 */
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
341 assert(op == TOK.TOKconstruct);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
342 //error("cannot assign to static array %s", e1.toChars());
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
343 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
344 else if (e1.op == TOK.TOKslice)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
345 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
346 e2 = e2.implicitCastTo(sc, e1.type.constOf());
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
347 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
348 else
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
349 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
350 e2 = e2.implicitCastTo(sc, e1.type);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
351 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
352
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
353 /* Look for array operations
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
354 */
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
355 if (e1.op == TOK.TOKslice && !ismemset &&
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
356 (e2.op == TOK.TOKadd || e2.op == TOK.TOKmin ||
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
357 e2.op == TOK.TOKmul || e2.op == TOK.TOKdiv ||
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
358 e2.op == TOK.TOKmod || e2.op == TOK.TOKxor ||
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
359 e2.op == TOK.TOKand || e2.op == TOK.TOKor ||
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
360 e2.op == TOK.TOKtilde || e2.op == TOK.TOKneg))
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
361 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
362 type = e1.type;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
363 return arrayOp(sc);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
364 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
365
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
366 type = e1.type;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
367 assert(type);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
368 return this;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
369 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
370
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
371 override Expression checkToBoolean()
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
372 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
373 assert(false);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
374 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
375
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
376 override Expression interpret(InterState istate)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
377 {
63
cab4c37afb89 A bunch of implementations
korDen
parents: 12
diff changeset
378 return interpretAssignCommon(istate, null);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
379 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
380
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
381 override Identifier opId()
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
382 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
383 return Id.assign;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
384 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
385
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
386 override void buildArrayIdent(OutBuffer buf, Expressions arguments)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
387 {
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
388 /* Evaluate assign expressions right to left
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
389 */
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
390 e2.buildArrayIdent(buf, arguments);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
391 e1.buildArrayIdent(buf, arguments);
12
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
392 buf.writestring("Assign");
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
393 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
394
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 126
diff changeset
395 override Expression buildArrayLoop(Parameters fparams)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
396 {
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
397 /* Evaluate assign expressions right to left
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
398 */
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
399 Expression ex2 = e2.buildArrayLoop(fparams);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
400 version (DMDV2) {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
401 /* Need the cast because:
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
402 * b = c + p[i];
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
403 * where b is a byte fails because (c + p[i]) is an int
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
404 * which cannot be implicitly cast to byte.
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
405 */
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
406 ex2 = new CastExp(Loc(0), ex2, e1.type.nextOf());
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
407 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
408 Expression ex1 = e1.buildArrayLoop(fparams);
126
1765f3ef917d ClassDeclarations, Arguments -> Vector
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
409 auto param = fparams[0];
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
410 param.storageClass = STCundefined;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
411 Expression e = new AssignExp(Loc(0), ex1, ex2);
12
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
412 return e;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
413 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
414
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
415 override elem* toElem(IRState* irs)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
416 {
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
417 Type t1b;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
418
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
419 //printf("AssignExp.toElem('%s')\n", toChars());
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
420 t1b = e1.type.toBasetype();
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
421
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
422 // Look for array.length = n
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
423 if (e1.op == TOK.TOKarraylength)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
424 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
425 // Generate:
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
426 // _d_arraysetlength(e2, sizeelem, &ale.e1);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
427
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
428 ArrayLengthExp ale = cast(ArrayLengthExp)e1;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
429
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 126
diff changeset
430 auto p1 = e2.toElem(irs);
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 126
diff changeset
431 auto p3 = ale.e1.toElem(irs);
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
432 p3 = addressElem(p3, null);
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 126
diff changeset
433 Type t1 = ale.e1.type.toBasetype();
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
434
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
435 // call _d_arraysetlengthT(ti, e2, &ale.e1);
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 126
diff changeset
436 auto p2 = t1.getTypeInfo(null).toElem(irs);
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 126
diff changeset
437 auto ep = el_params(p3, p1, p2, null); // c function
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 126
diff changeset
438 int r = t1.nextOf().isZeroInit(Loc(0)) ? RTLSYM.RTLSYM_ARRAYSETLENGTHT : RTLSYM.RTLSYM_ARRAYSETLENGTHIT;
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 126
diff changeset
439
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 126
diff changeset
440 auto e = el_bin(OPER.OPcall, type.totym(), el_var(rtlsym[r]), ep);
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
441 el_setLoc(e, loc);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
442 return e;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
443 }
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 126
diff changeset
444
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 126
diff changeset
445 elem *e;
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 126
diff changeset
446 IndexExp ae;
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 126
diff changeset
447
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
448 // Look for array[]=n
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
449 if (e1.op == TOK.TOKslice)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
450 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
451 Type t1 = t1b;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
452 Type t2 = e2.type.toBasetype();
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
453
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
454 // which we do if the 'next' types match
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
455 if (ismemset)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
456 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
457 // Do a memset for array[]=v
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
458 //printf("Lpair %s\n", toChars());
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
459 SliceExp are = cast(SliceExp)e1;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
460 elem* elwr;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
461 elem* eupr;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
462 elem* n1;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
463 elem* evalue;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
464 elem* enbytes;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
465 elem* elength;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
466 elem* einit;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
467 long value;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
468 Type ta = are.e1.type.toBasetype();
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
469 Type tb = ta.nextOf().toBasetype();
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
470 int sz = cast(uint)tb.size();
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
471 tym_t tym = type.totym();
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
472
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
473 n1 = are.e1.toElem(irs);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
474 elwr = are.lwr ? are.lwr.toElem(irs) : null;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
475 eupr = are.upr ? are.upr.toElem(irs) : null;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
476
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
477 elem* n1x = n1;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
478
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
479 // Look for array[]=n
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
480 if (ta.ty == TY.Tsarray)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
481 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
482 TypeSArray ts = cast(TypeSArray)ta;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
483 n1 = array_toPtr(ta, n1);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
484 enbytes = ts.dim.toElem(irs);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
485 n1x = n1;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
486 n1 = el_same(&n1x);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
487 einit = resolveLengthVar(are.lengthVar, &n1, ta);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
488 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
489 else if (ta.ty == TY.Tarray)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
490 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
491 n1 = el_same(&n1x);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
492 einit = resolveLengthVar(are.lengthVar, &n1, ta);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
493 enbytes = el_copytree(n1);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
494 n1 = array_toPtr(ta, n1);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
495 enbytes = el_una(OPER.OP64_32, TYM.TYint, enbytes);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
496 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
497 else if (ta.ty == TY.Tpointer)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
498 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
499 n1 = el_same(&n1x);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
500 enbytes = el_long(TYM.TYint, -1); // largest possible index
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
501 einit = null;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
502 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
503
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
504 // Enforce order of evaluation of n1[elwr..eupr] as n1,elwr,eupr
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
505 elem* elwrx = elwr;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
506 if (elwr) elwr = el_same(&elwrx);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
507 elem* euprx = eupr;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
508 if (eupr) eupr = el_same(&euprx);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
509
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
510 static if (false) {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
511 printf("sz = %d\n", sz);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
512 printf("n1x\n");
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
513 elem_print(n1x);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
514 printf("einit\n");
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
515 elem_print(einit);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
516 printf("elwrx\n");
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
517 elem_print(elwrx);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
518 printf("euprx\n");
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
519 elem_print(euprx);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
520 printf("n1\n");
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
521 elem_print(n1);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
522 printf("elwr\n");
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
523 elem_print(elwr);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
524 printf("eupr\n");
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
525 elem_print(eupr);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
526 printf("enbytes\n");
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
527 elem_print(enbytes);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
528 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
529 einit = el_combine(n1x, einit);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
530 einit = el_combine(einit, elwrx);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
531 einit = el_combine(einit, euprx);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
532
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
533 evalue = this.e2.toElem(irs);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
534
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
535 static if (false) {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
536 printf("n1\n");
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
537 elem_print(n1);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
538 printf("enbytes\n");
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
539 elem_print(enbytes);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
540 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
541
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 126
diff changeset
542 if (irs.arrayBoundsCheck() && eupr && ta.ty != TY.Tpointer)
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
543 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
544 elem *c1;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
545 elem *c2;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
546 elem *ea;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
547 elem *eb;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
548 elem *enbytesx;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
549
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
550 assert(elwr);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
551 enbytesx = enbytes;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
552 enbytes = el_same(&enbytesx);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
553 c1 = el_bin(OPER.OPle, TYM.TYint, el_copytree(eupr), enbytesx);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
554 c2 = el_bin(OPER.OPle, TYM.TYint, el_copytree(elwr), el_copytree(eupr));
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
555 c1 = el_bin(OPER.OPandand, TYM.TYint, c1, c2);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
556
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
557 // Construct: (c1 || ModuleArray(line))
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
558 Symbol *sassert;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
559
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
560 sassert = irs.blx.module_.toModuleArray();
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
561 ea = el_bin(OPER.OPcall,TYM.TYvoid,el_var(sassert), el_long(TYM.TYint, loc.linnum));
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
562 eb = el_bin(OPER.OPoror,TYM.TYvoid,c1,ea);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
563 einit = el_combine(einit, eb);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
564 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
565
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
566 if (elwr)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
567 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
568 elem *elwr2;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
569
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
570 el_free(enbytes);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
571 elwr2 = el_copytree(elwr);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
572 elwr2 = el_bin(OPER.OPmul, TYM.TYint, elwr2, el_long(TYM.TYint, sz));
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
573 n1 = el_bin(OPER.OPadd, TYM.TYnptr, n1, elwr2);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
574 enbytes = el_bin(OPER.OPmin, TYM.TYint, eupr, elwr);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
575 elength = el_copytree(enbytes);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
576 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
577 else
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
578 elength = el_copytree(enbytes);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
579
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
580 e = setArray(n1, enbytes, tb, evalue, irs, op);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
581 Lpair:
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
582 e = el_pair(TYM.TYullong, elength, e);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
583 Lret2:
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
584 e = el_combine(einit, e);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
585 //elem_print(e);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
586 goto Lret;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
587 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
588 ///static if (false) {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
589 /// else if (e2.op == TOK.TOKadd || e2.op == TOK.TOKmin)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
590 /// {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
591 /// /* It's ea[] = eb[] +- ec[]
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
592 /// */
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
593 /// BinExp e2a = cast(BinExp)e2;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
594 /// Type t = e2.type.toBasetype().nextOf().toBasetype();
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
595 /// if (t.ty != TY.Tfloat32 && t.ty != TY.Tfloat64 && t.ty != TY.Tfloat80)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
596 /// {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
597 /// e2.error("array add/min for %s not supported", t.toChars());
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
598 /// return el_long(TYM.TYint, 0);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
599 /// }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
600 /// elem* ea = e1.toElem(irs);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
601 /// ea = array_toDarray(e1.type, ea);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
602 /// elem* eb = e2a.e1.toElem(irs);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
603 /// eb = array_toDarray(e2a.e1.type, eb);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
604 /// elem* ec = e2a.e2.toElem(irs);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
605 /// ec = array_toDarray(e2a.e2.type, ec);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
606 ///
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
607 /// int rtl = RTLSYM.RTLSYM_ARRAYASSADDFLOAT;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
608 /// if (t.ty == Tfloat64)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
609 /// rtl = RTLSYM.RTLSYM_ARRAYASSADDDOUBLE;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
610 /// else if (t.ty == Tfloat80)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
611 /// rtl = RTLSYM.RTLSYM_ARRAYASSADDREAL;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
612 /// if (e2.op == TOK.TOKmin)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
613 /// {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
614 /// rtl = RTLSYM.RTLSYM_ARRAYASSMINFLOAT;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
615 /// if (t.ty == Tfloat64)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
616 /// rtl = RTLSYM.RTLSYM_ARRAYASSMINDOUBLE;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
617 /// else if (t.ty == Tfloat80)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
618 /// rtl = RTLSYM.RTLSYM_ARRAYASSMINREAL;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
619 /// }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
620 ///
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
621 /// /* Set parameters so the order of evaluation is eb, ec, ea
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
622 /// */
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
623 /// elem* ep = el_params(eb, ec, ea, null);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
624 /// e = el_bin(OPER.OPcall, type.totym(), el_var(rtlsym[rtl]), ep);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
625 /// goto Lret;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
626 /// }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
627 ///}
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
628 else
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
629 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
630 /* It's array1[]=array2[]
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
631 * which is a memcpy
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
632 */
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
633 elem* ep;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
634
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 126
diff changeset
635 auto eto = e1.toElem(irs);
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 126
diff changeset
636 auto efrom = e2.toElem(irs);
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
637
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
638 uint size = cast(uint)t1.nextOf().size();
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 126
diff changeset
639 auto esize = el_long(TYM.TYint, size);
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
640
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
641 /* Determine if we need to do postblit
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
642 */
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
643 int postblit = 0;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
644 if (needsPostblit(t1))
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
645 postblit = 1;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
646
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
647 assert(e2.type.ty != TY.Tpointer);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
648
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 126
diff changeset
649 if (!postblit && !irs.arrayBoundsCheck())
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
650 {
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 126
diff changeset
651 auto ex = el_same(&eto);
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
652
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
653 // Determine if elen is a constant
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 126
diff changeset
654 elem *elen;
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
655 if (eto.Eoper == OPER.OPpair && eto.E1.Eoper == OPER.OPconst)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
656 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
657 elen = el_copytree(eto.E1);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
658 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
659 else
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
660 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
661 // It's not a constant, so pull it from the dynamic array
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
662 elen = el_una(OPER.OP64_32, TYM.TYint, el_copytree(ex));
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
663 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
664
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
665 esize = el_bin(OPER.OPmul, TYM.TYint, elen, esize);
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 126
diff changeset
666 auto epto = array_toPtr(e1.type, ex);
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 126
diff changeset
667 auto epfr = array_toPtr(e2.type, efrom);
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
668 static if (true) {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
669 // memcpy() is faster, so if we can't beat 'em, join 'em
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
670 e = el_params(esize, epfr, epto, null);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
671 e = el_bin(OPER.OPcall, TYM.TYnptr, el_var(rtlsym[RTLSYM.RTLSYM_MEMCPY]), e);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
672 } else {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
673 e = el_bin(OPER.OPmemcpy, TYM.TYnptr, epto, el_param(epfr, esize));
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
674 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
675 e = el_pair(eto.Ety, el_copytree(elen), e);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
676 e = el_combine(eto, e);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
677 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
678 ///version (DMDV2) {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
679 else if (postblit && op != TOK.TOKblit)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
680 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
681 /* Generate:
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
682 * _d_arrayassign(ti, efrom, eto)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
683 * or:
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
684 * _d_arrayctor(ti, efrom, eto)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
685 */
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
686 el_free(esize);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
687 Expression ti = t1.nextOf().toBasetype().getTypeInfo(null);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
688 ep = el_params(eto, efrom, ti.toElem(irs), null);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
689 int rtl = (op == TOK.TOKconstruct) ? RTLSYM.RTLSYM_ARRAYCTOR : RTLSYM.RTLSYM_ARRAYASSIGN;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
690 e = el_bin(OPER.OPcall, type.totym(), el_var(rtlsym[rtl]), ep);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
691 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
692 ///}
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
693 else
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
694 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
695 // Generate:
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
696 // _d_arraycopy(eto, efrom, esize)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
697
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
698 ep = el_params(eto, efrom, esize, null);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
699 e = el_bin(OPER.OPcall, type.totym(), el_var(rtlsym[RTLSYM.RTLSYM_ARRAYCOPY]), ep);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
700 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
701 el_setLoc(e, loc);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
702 return e;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
703 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
704 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
705
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
706 if (e1.op == TOK.TOKindex)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
707 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
708 elem* eb;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
709 elem* ei;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
710 elem* ev;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
711 TY ty;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
712 Type ta;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
713
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
714 ae = cast(IndexExp)e1;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
715 ta = ae.e1.type.toBasetype();
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
716 ty = ta.ty;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
717 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
718
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
719 version (DMDV2) {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
720 /* Look for reference initializations
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
721 */
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
722 if (op == TOK.TOKconstruct && e1.op == TOK.TOKvar)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
723 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
724 VarExp ve = cast(VarExp)e1;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
725 Declaration s = ve.var;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
726 if (s.storage_class & STC.STCref)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
727 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
728 static if (false) {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
729 Expression ae = e2.addressOf(null);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
730 e = ae.toElem(irs);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
731 } else {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
732 e = e2.toElem(irs);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
733 e = addressElem(e, e2.type);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
734 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
735 elem* es = el_var(s.toSymbol());
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
736 es.Ety = TYM.TYnptr;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
737 e = el_bin(OPER.OPeq, TYM.TYnptr, es, e);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
738 // BUG: type is struct, and e2 is TOKint64
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
739 goto Lret;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
740 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
741 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
742 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
743
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
744 static if (true) {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
745 /* This will work if we can distinguish an assignment from
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
746 * an initialization of the lvalue. It'll work if the latter.
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
747 * If the former, because of aliasing of the return value with
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
748 * function arguments, it'll fail.
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
749 */
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
750 if (op == TOK.TOKconstruct && e2.op == TOK.TOKcall)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
751 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
752 CallExp ce = cast(CallExp)e2;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
753
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
754 Type t = ce.e1.type.toBasetype();
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
755 if (t.ty == TY.Tfunction) {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
756 TypeFunction tf = cast(TypeFunction)t;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
757 if (tf.retStyle() == RET.RETstack)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
758 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
759 elem* ehidden = e1.toElem(irs);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
760 ehidden = el_una(OPER.OPaddr, TYM.TYnptr, ehidden);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
761 assert(!irs.ehidden);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
762 irs.ehidden = ehidden;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
763 e = e2.toElem(irs);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
764 goto Lret;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
765 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
766 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
767 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
768 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
769 //printf("test2 %d\n", op);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
770 //if (op == TOK.TOKconstruct) printf("construct\n");
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
771 if (t1b.ty == TY.Tstruct)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
772 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
773 elem* eleft = e1.toElem(irs);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
774
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
775 if (e2.op == TOK.TOKint64)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
776 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
777 /* Implement:
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
778 * (struct = 0)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
779 * with:
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
780 * memset(&struct, 0, struct.sizeof)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
781 */
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
782 elem* ey = null;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
783 int sz = cast(int)e1.type.size();
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
784 StructDeclaration sd = (cast(TypeStruct)t1b).sym;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
785 if (sd.isnested && op == TOK.TOKconstruct)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
786 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
787 ey = el_una(OPER.OPaddr, TYM.TYnptr, eleft);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
788 eleft = el_same(&ey);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
789 ey = setEthis(loc, irs, ey, sd);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
790 sz = sd.vthis.offset;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
791 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
792
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
793 elem *el = eleft;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
794 elem *enbytes = el_long(TYM.TYint, sz);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
795 elem *evalue = el_long(TYM.TYint, 0);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
796
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
797 if (!(sd.isnested && op == TOK.TOKconstruct))
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
798 el = el_una(OPER.OPaddr, TYM.TYnptr, el);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
799
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
800 e = el_param(enbytes, evalue);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
801 e = el_bin(OPER.OPmemset, TYM.TYnptr,el,e);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
802 e = el_combine(ey, e);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
803 el_setLoc(e, loc);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
804 //e = el_una(OPER.OPind, TYM.TYstruct, e);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
805 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
806 else
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
807 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
808 //printf("toElemBin() '%s'\n", toChars());
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
809
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
810 tym_t tym = type.totym();
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
811
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
812 elem* e1 = eleft;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
813 elem* ex = e1;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
814 if (e1.Eoper == OPER.OPind)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
815 ex = e1.E1;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
816
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
817 if (this.e2.op == TOK.TOKstructliteral && ex.Eoper == OPER.OPvar && ex.EV.sp.Voffset == 0)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
818 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
819 StructLiteralExp se = cast(StructLiteralExp)this.e2;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
820
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
821 Symbol* symSave = se.sym;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
822 size_t soffsetSave = se.soffset;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
823 int fillHolesSave = se.fillHoles;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
824
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
825 se.sym = ex.EV.sp.Vsym;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
826 se.soffset = 0;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
827 se.fillHoles = (op == TOK.TOKconstruct || op == TOK.TOKblit) ? 1 : 0;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
828
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
829 el_free(e1);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
830 e = this.e2.toElem(irs);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
831
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
832 se.sym = symSave;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
833 se.soffset = soffsetSave;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
834 se.fillHoles = fillHolesSave;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
835 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
836 else
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
837 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
838 elem* e2 = this.e2.toElem(irs);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
839 e = el_bin(OPER.OPstreq,tym,e1,e2);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
840 e.Enumbytes = cast(uint)this.e1.type.size();
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
841 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
842 goto Lret;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
843 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
844 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
845 else
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
846 e = toElemBin(irs,OPER.OPeq);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
847
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
848 return e;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
849
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
850 Lret:
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
851 el_setLoc(e,loc);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
852 return e;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
853 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
854 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
855