annotate dmdscript_tango/expression.d @ 0:55c2951c07be

initial, files origin, premoved tree
author saaadel
date Sun, 24 Jan 2010 12:34:47 +0200
parents
children 8363a4bf6a8f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2 /* Digital Mars DMDScript source code.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
3 * Copyright (c) 2000-2002 by Chromium Communications
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
4 * D version Copyright (c) 2004-2005 by Digital Mars
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
5 * All Rights Reserved
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
6 * written by Walter Bright
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
7 * www.digitalmars.com
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
8 * Use at your own risk. There is no warranty, express or implied.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
9 * License for redistribution is by the GNU General Public License in gpl.txt.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
10 *
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
11 * A binary, non-exclusive license for commercial use can be
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
12 * purchased from www.digitalmars.com/dscript/buy.html.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
13 *
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
14 * DMDScript is implemented in the D Programming Language,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
15 * www.digitalmars.com/d/
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
16 *
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
17 * For a C++ implementation of DMDScript, including COM support,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
18 * see www.digitalmars.com/dscript/cppscript.html.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
19 */
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
20
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
21
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
22 module dmdscript.expression;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
23
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
24 import std.string;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
25
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
26 import dmdscript.script;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
27 import dmdscript.lexer;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
28 import dmdscript.scopex;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
29 import dmdscript.text;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
30 import dmdscript.errmsgs;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
31 import dmdscript.functiondefinition;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
32 import dmdscript.irstate;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
33 import dmdscript.ir;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
34 import dmdscript.opcodes;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
35 import dmdscript.identifier;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
36
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
37 /******************************** Expression **************************/
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
38
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
39 class Expression
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
40 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
41 const uint EXPRESSION_SIGNATURE = 0x3AF31E3F;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
42 uint signature = EXPRESSION_SIGNATURE;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
43
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
44 Loc loc; // file location
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
45 TOK op;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
46
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
47 this(Loc loc, TOK op)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
48 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
49 this.loc = loc;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
50 this.op = op;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
51 signature = EXPRESSION_SIGNATURE;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
52 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
53
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
54 invariant
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
55 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
56 assert(signature == EXPRESSION_SIGNATURE);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
57 assert(op != TOKreserved && op < TOKmax);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
58 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
59
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
60 /**************************
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
61 * Semantically analyze Expression.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
62 * Determine types, fold constants, etc.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
63 */
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
64
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
65 Expression semantic(Scope *sc)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
66 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
67 return this;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
68 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
69
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
70 tchar[] toString()
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
71 { tchar[] buf;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
72
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
73 toBuffer(buf);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
74 return buf;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
75 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
76
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
77 void toBuffer(inout char[] buf)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
78 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
79 buf ~= toString();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
80 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
81
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
82 void checkLvalue(Scope *sc)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
83 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
84 tchar[] buf;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
85
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
86 //writefln("checkLvalue(), op = %d", op);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
87 if (sc.funcdef)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
88 { if (sc.funcdef.isanonymous)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
89 buf = "anonymous";
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
90 else if (sc.funcdef.name)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
91 buf = sc.funcdef.name.toString();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
92 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
93 buf ~= std.string.format("(%d) : Error: ", loc);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
94 buf ~= std.string.format(errmsgtbl[ERR_CANNOT_ASSIGN_TO], toString());
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
95
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
96 if (!sc.errinfo.message)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
97 { sc.errinfo.message = buf;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
98 sc.errinfo.linnum = loc;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
99 sc.errinfo.srcline = Lexer.locToSrcline(sc.getSource().ptr, loc);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
100 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
101 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
102
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
103 // Do we match for purposes of optimization?
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
104
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
105 int match(Expression e)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
106 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
107 return false;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
108 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
109
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
110 // Is the result of the expression guaranteed to be a boolean?
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
111
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
112 int isBooleanResult()
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
113 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
114 return false;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
115 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
116
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
117 void toIR(IRstate *irs, uint ret)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
118 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
119 //writef("Expression::toIR('%s')\n", toChars());
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
120 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
121
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
122 void toLvalue(IRstate *irs, out uint base, IR *property, out int opoff)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
123 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
124 base = irs.alloc(1);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
125 toIR(irs, base);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
126 property.index = 0;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
127 opoff = 3;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
128 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
129 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
130
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
131 /******************************** RealExpression **************************/
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
132
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
133 class RealExpression : Expression
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
134 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
135 real_t value;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
136
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
137 this(Loc loc, real_t value)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
138 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
139 super(loc, TOKreal);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
140 this.value = value;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
141 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
142
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
143 tchar[] toString()
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
144 { tchar[] buf;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
145 long i;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
146
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
147 i = cast(long) value;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
148 if (i == value)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
149 buf = std.string.format("%d", i);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
150 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
151 buf = std.string.format("%g", value);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
152 return buf;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
153 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
154
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
155 void toBuffer(inout tchar[] buf)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
156 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
157 buf ~= std.string.format("%g", value);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
158 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
159
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
160 void toIR(IRstate *irs, uint ret)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
161 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
162 //writef("RealExpression::toIR(%g)\n", value);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
163
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
164 static assert(value.sizeof == 2 * uint.sizeof);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
165 if (ret)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
166 irs.gen(loc, IRnumber, 3, ret, value);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
167 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
168 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
169
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
170 /******************************** IdentifierExpression **************************/
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
171
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
172 class IdentifierExpression : Expression
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
173 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
174 Identifier *ident;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
175
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
176 this(Loc loc, Identifier *ident)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
177 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
178 super(loc, TOKidentifier);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
179 this.ident = ident;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
180 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
181
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
182 Expression semantic(Scope *sc)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
183 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
184 return this;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
185 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
186
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
187 tchar[] toString()
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
188 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
189 return ident.toString();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
190 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
191
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
192 void checkLvalue(Scope *sc)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
193 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
194 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
195
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
196 int match(Expression e)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
197 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
198 if (e.op != TOKidentifier)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
199 return 0;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
200
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
201 IdentifierExpression ie = cast(IdentifierExpression)(e);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
202
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
203 return ident == ie.ident;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
204 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
205
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
206 void toIR(IRstate *irs, uint ret)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
207 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
208 Identifier* id = ident;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
209
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
210 assert(id.sizeof == uint.sizeof);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
211 if (ret)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
212 irs.gen2(loc, IRgetscope, ret, cast(uint)id);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
213 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
214
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
215 void toLvalue(IRstate *irs, out uint base, IR *property, out int opoff)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
216 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
217 //irs.gen1(loc, IRthis, base);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
218 property.id = ident;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
219 opoff = 2;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
220 base = ~0u;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
221 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
222 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
223
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
224 /******************************** ThisExpression **************************/
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
225
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
226 class ThisExpression : Expression
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
227 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
228 this(Loc loc)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
229 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
230 super(loc, TOKthis);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
231 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
232
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
233 tchar[] toString()
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
234 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
235 return TEXT_this;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
236 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
237
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
238 Expression semantic(Scope *sc)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
239 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
240 return this;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
241 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
242
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
243 void toIR(IRstate *irs, uint ret)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
244 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
245 if (ret)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
246 irs.gen1(loc, IRthis, ret);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
247 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
248 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
249
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
250 /******************************** NullExpression **************************/
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
251
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
252 class NullExpression : Expression
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
253 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
254 this(Loc loc)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
255 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
256 super(loc, TOKnull);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
257 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
258
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
259 tchar[] toString()
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
260 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
261 return TEXT_null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
262 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
263
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
264 void toIR(IRstate *irs, uint ret)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
265 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
266 if (ret)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
267 irs.gen1(loc, IRnull, ret);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
268 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
269 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
270
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
271 /******************************** StringExpression **************************/
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
272
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
273 class StringExpression : Expression
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
274 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
275 tchar[] string;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
276
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
277 this(Loc loc, tchar[] string)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
278 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
279 //writefln("StringExpression('%s')", string);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
280 super(loc, TOKstring);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
281 this.string = string;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
282 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
283
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
284 void toBuffer(inout tchar[] buf)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
285 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
286 buf ~= '"';
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
287 foreach (dchar c; string)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
288 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
289 switch (c)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
290 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
291 case '"':
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
292 buf ~= '\\';
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
293 goto Ldefault;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
294
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
295 default:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
296 Ldefault:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
297 if (c & ~0xFF)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
298 buf ~= std.string.format("\\u%04x", c);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
299 else if (std.ctype.isprint(c))
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
300 buf ~= cast(tchar)c;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
301 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
302 buf ~= std.string.format("\\x%02x", c);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
303 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
304 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
305 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
306 buf ~= '"';
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
307 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
308
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
309 void toIR(IRstate *irs, uint ret)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
310 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
311 static assert((Identifier*).sizeof == uint.sizeof);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
312 if (ret)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
313 { uint u = cast(uint)Identifier.build(string);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
314 irs.gen2(loc, IRstring, ret, u);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
315 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
316 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
317 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
318
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
319 /******************************** RegExpLiteral **************************/
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
320
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
321 class RegExpLiteral : Expression
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
322 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
323 tchar[] string;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
324
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
325 this(Loc loc, tchar[] string)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
326 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
327 //writefln("RegExpLiteral('%s')", string);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
328 super(loc, TOKregexp);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
329 this.string = string;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
330 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
331
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
332 void toBuffer(inout tchar[] buf)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
333 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
334 buf ~= string;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
335 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
336
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
337 void toIR(IRstate *irs, uint ret)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
338 { d_string pattern;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
339 d_string attribute = null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
340 int e;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
341
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
342 uint argc;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
343 uint argv;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
344 uint b;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
345
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
346 // Regular expression is of the form:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
347 // /pattern/attribute
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
348
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
349 // Parse out pattern and attribute strings
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
350 assert(string[0] == '/');
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
351 e = std.string.rfind(string, '/');
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
352 assert(e != -1);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
353 pattern = string[1 .. e];
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
354 argc = 1;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
355 if (e + 1 < string.length)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
356 { attribute = string[e + 1 .. length];
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
357 argc++;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
358 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
359
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
360 // Generate new Regexp(pattern [, attribute])
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
361
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
362 b = irs.alloc(1);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
363 Identifier* re = Identifier.build(TEXT_RegExp);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
364 irs.gen2(loc, IRgetscope, b, cast(uint)re);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
365 argv = irs.alloc(argc);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
366 irs.gen2(loc, IRstring, argv, cast(uint)Identifier.build(pattern));
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
367 if (argc == 2)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
368 irs.gen2(loc, IRstring, argv + 1 * INDEX_FACTOR, cast(uint)Identifier.build(attribute));
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
369 irs.gen4(loc, IRnew, ret,b,argc,argv);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
370 irs.release(b, argc + 1);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
371 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
372 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
373
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
374 /******************************** BooleanExpression **************************/
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
375
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
376 class BooleanExpression : Expression
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
377 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
378 int boolean;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
379
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
380 this(Loc loc, int boolean)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
381 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
382 super(loc, TOKboolean);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
383 this.boolean = boolean;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
384 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
385
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
386 tchar[] toString()
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
387 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
388 return boolean ? "true" : "false";
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
389 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
390
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
391 void toBuffer(inout tchar[] buf)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
392 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
393 buf ~= toString();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
394 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
395
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
396 int isBooleanResult()
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
397 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
398 return true;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
399 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
400
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
401 void toIR(IRstate *irs, uint ret)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
402 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
403 if (ret)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
404 irs.gen2(loc, IRboolean, ret, boolean);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
405 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
406 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
407
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
408 /******************************** ArrayLiteral **************************/
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
409
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
410 class ArrayLiteral : Expression
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
411 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
412 Expression[] elements;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
413
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
414 this(Loc loc, Expression[] elements)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
415 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
416 super(loc, TOKarraylit);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
417 this.elements = elements;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
418 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
419
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
420 Expression semantic(Scope *sc)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
421 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
422 foreach (inout Expression e; elements)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
423 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
424 if (e)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
425 e = e.semantic(sc);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
426 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
427 return this;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
428 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
429
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
430 void toBuffer(inout tchar[] buf)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
431 { uint i;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
432
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
433 buf ~= '[';
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
434 foreach (Expression e; elements)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
435 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
436 if (i)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
437 buf ~= ',';
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
438 i = 1;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
439 if (e)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
440 e.toBuffer(buf);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
441 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
442 buf ~= ']';
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
443 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
444
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
445 void toIR(IRstate *irs, uint ret)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
446 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
447 uint argc;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
448 uint argv;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
449 uint b;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
450 uint v;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
451
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
452 b = irs.alloc(1);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
453 static Identifier* ar;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
454 if (!ar)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
455 ar = Identifier.build(TEXT_Array);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
456 irs.gen2(loc, IRgetscope, b, cast(uint)ar);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
457 if (elements.length)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
458 { Expression e;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
459
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
460 argc = elements.length;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
461 argv = irs.alloc(argc);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
462 if (argc > 1)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
463 { uint i;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
464
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
465 // array literal [a, b, c] is equivalent to:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
466 // new Array(a,b,c)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
467 for (i = 0; i < argc; i++)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
468 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
469 e = elements[i];
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
470 if (e)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
471 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
472 e.toIR(irs, argv + i * INDEX_FACTOR);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
473 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
474 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
475 irs.gen1(loc, IRundefined, argv + i * INDEX_FACTOR);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
476 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
477 irs.gen4(loc, IRnew, ret,b,argc,argv);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
478 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
479 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
480 { // [a] translates to:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
481 // ret = new Array(1);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
482 // ret[0] = a
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
483 irs.gen(loc, IRnumber, 3, argv, 1.0);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
484 irs.gen4(loc, IRnew, ret,b,argc,argv);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
485
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
486 e = elements[0];
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
487 v = irs.alloc(1);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
488 if (e)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
489 e.toIR(irs, v);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
490 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
491 irs.gen1(loc, IRundefined, v);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
492 irs.gen3(loc, IRputs, v, ret, cast(uint)Identifier.build(TEXT_0));
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
493 irs.release(v, 1);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
494 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
495 irs.release(argv, argc);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
496 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
497 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
498 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
499 // Generate new Array()
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
500 irs.gen4(loc, IRnew, ret,b,0,0);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
501 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
502 irs.release(b, 1);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
503 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
504 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
505
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
506 /******************************** FieldLiteral **************************/
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
507
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
508 class Field
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
509 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
510 Identifier* ident;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
511 Expression exp;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
512
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
513 this(Identifier *ident, Expression exp)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
514 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
515 this.ident = ident;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
516 this.exp = exp;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
517 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
518 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
519
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
520 /******************************** ObjectLiteral **************************/
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
521
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
522 class ObjectLiteral : Expression
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
523 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
524 Field[] fields;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
525
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
526 this(Loc loc, Field[] fields)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
527 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
528 super(loc, TOKobjectlit);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
529 this.fields = fields;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
530 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
531
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
532 Expression semantic(Scope *sc)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
533 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
534 foreach (Field f; fields)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
535 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
536 f.exp = f.exp.semantic(sc);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
537 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
538 return this;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
539 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
540
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
541 void toBuffer(inout tchar[] buf)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
542 { uint i;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
543
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
544 buf ~= '{';
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
545 foreach (Field f; fields)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
546 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
547 if (i)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
548 buf ~= ',';
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
549 i = 1;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
550 buf ~= f.ident.toString();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
551 buf ~= ':';
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
552 f.exp.toBuffer(buf);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
553 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
554 buf ~= '}';
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
555 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
556
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
557 void toIR(IRstate *irs, uint ret)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
558 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
559 uint b;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
560
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
561 b = irs.alloc(1);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
562 //irs.gen2(loc, IRstring, b, TEXT_Object);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
563 Identifier* ob = Identifier.build(TEXT_Object);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
564 irs.gen2(loc, IRgetscope, b, cast(uint)ob);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
565 // Generate new Object()
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
566 irs.gen4(loc, IRnew, ret,b,0,0);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
567 if (fields.length)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
568 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
569 uint x;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
570
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
571 x = irs.alloc(1);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
572 foreach (Field f; fields)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
573 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
574 f.exp.toIR(irs, x);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
575 irs.gen3(loc, IRputs, x, ret, cast(uint)(f.ident));
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
576 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
577 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
578 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
579 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
580
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
581 /******************************** FunctionLiteral **************************/
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
582
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
583 class FunctionLiteral : Expression
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
584 { FunctionDefinition func;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
585
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
586 this(Loc loc, FunctionDefinition func)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
587 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
588 super(loc, TOKobjectlit);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
589 this.func = func;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
590 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
591
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
592 Expression semantic(Scope *sc)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
593 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
594 func = cast(FunctionDefinition)(func.semantic(sc));
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
595 return this;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
596 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
597
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
598 void toBuffer(inout tchar[] buf)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
599 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
600 func.toBuffer(buf);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
601 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
602
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
603 void toIR(IRstate *irs, uint ret)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
604 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
605 func.toIR(null);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
606 irs.gen2(loc, IRobject, ret, cast(uint)cast(void*)func);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
607 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
608 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
609
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
610 /***************************** UnaExp *************************************/
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
611
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
612 class UnaExp : Expression
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
613 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
614 Expression e1;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
615
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
616 this(Loc loc, TOK op, Expression e1)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
617 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
618 super(loc, op);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
619 this.e1 = e1;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
620 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
621
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
622 Expression semantic(Scope *sc)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
623 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
624 e1 = e1.semantic(sc);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
625 return this;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
626 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
627
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
628 void toBuffer(inout tchar[] buf)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
629 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
630 buf ~= Token.toString(op);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
631 buf ~= ' ';
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
632 e1.toBuffer(buf);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
633 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
634 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
635
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
636 /***************************** BinExp *************************************/
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
637
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
638 class BinExp : Expression
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
639 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
640 Expression e1;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
641 Expression e2;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
642
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
643 this(Loc loc, TOK op, Expression e1, Expression e2)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
644 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
645 super(loc, op);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
646 this.e1 = e1;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
647 this.e2 = e2;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
648 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
649
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
650 Expression semantic(Scope *sc)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
651 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
652 e1 = e1.semantic(sc);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
653 e2 = e2.semantic(sc);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
654 return this;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
655 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
656
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
657 void toBuffer(inout tchar[] buf)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
658 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
659 e1.toBuffer(buf);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
660 buf ~= ' ';
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
661 buf ~= Token.toString(op);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
662 buf ~= ' ';
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
663 e2.toBuffer(buf);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
664 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
665
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
666 void binIR(IRstate *irs, uint ret, uint ircode)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
667 { uint b;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
668 uint c;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
669
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
670 if (ret)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
671 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
672 b = irs.alloc(1);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
673 e1.toIR(irs, b);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
674 if (e1.match(e2))
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
675 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
676 irs.gen3(loc, ircode, ret, b, b);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
677 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
678 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
679 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
680 c = irs.alloc(1);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
681 e2.toIR(irs, c);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
682 irs.gen3(loc, ircode, ret, b, c);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
683 irs.release(c, 1);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
684 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
685 irs.release(b, 1);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
686 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
687 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
688 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
689 e1.toIR(irs, 0);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
690 e2.toIR(irs, 0);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
691 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
692 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
693 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
694
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
695 /************************************************************/
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
696
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
697 /* Handle ++e and --e
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
698 */
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
699
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
700 class PreExp : UnaExp
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
701 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
702 uint ircode;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
703
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
704 this(Loc loc, uint ircode, Expression e)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
705 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
706 super(loc, TOKplusplus, e);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
707 this.ircode = ircode;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
708 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
709
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
710 Expression semantic(Scope *sc)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
711 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
712 super.semantic(sc);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
713 e1.checkLvalue(sc);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
714 return this;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
715 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
716
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
717 void toBuffer(inout tchar[] buf)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
718 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
719 e1.toBuffer(buf);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
720 buf ~= Token.toString(op);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
721 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
722
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
723 void toIR(IRstate *irs, uint ret)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
724 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
725 uint base;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
726 IR property;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
727 int opoff;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
728
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
729 //writef("PreExp::toIR('%s')\n", toChars());
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
730 e1.toLvalue(irs, base, &property, opoff);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
731 assert(opoff != 3);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
732 if (opoff == 2)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
733 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
734 //irs.gen2(loc, ircode + 2, ret, property.index);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
735 irs.gen3(loc, ircode + 2, ret, property.index, property.id.toHash());
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
736 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
737 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
738 irs.gen3(loc, ircode + opoff, ret, base, property.index);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
739 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
740 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
741
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
742 /************************************************************/
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
743
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
744 class PostIncExp : UnaExp
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
745 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
746 this(Loc loc, Expression e)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
747 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
748 super(loc, TOKplusplus, e);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
749 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
750
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
751 Expression semantic(Scope *sc)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
752 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
753 super.semantic(sc);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
754 e1.checkLvalue(sc);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
755 return this;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
756 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
757
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
758 void toBuffer(inout tchar[] buf)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
759 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
760 e1.toBuffer(buf);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
761 buf ~= Token.toString(op);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
762 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
763
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
764 void toIR(IRstate *irs, uint ret)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
765 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
766 uint base;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
767 IR property;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
768 int opoff;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
769
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
770 //writef("PostIncExp::toIR('%s')\n", toChars());
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
771 e1.toLvalue(irs, base, &property, opoff);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
772 assert(opoff != 3);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
773 if (opoff == 2)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
774 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
775 if (ret)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
776 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
777 irs.gen2(loc, IRpostincscope, ret, property.index);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
778 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
779 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
780 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
781 //irs.gen2(loc, IRpreincscope, ret, property.index);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
782 irs.gen3(loc, IRpreincscope, ret, property.index, property.id.toHash());
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
783 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
784 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
785 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
786 irs.gen3(loc, (ret ? IRpostinc : IRpreinc) + opoff, ret, base, property.index);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
787 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
788 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
789
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
790 /****************************************************************/
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
791
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
792 class PostDecExp : UnaExp
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
793 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
794 this(Loc loc, Expression e)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
795 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
796 super(loc, TOKplusplus, e);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
797 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
798
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
799 Expression semantic(Scope *sc)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
800 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
801 super.semantic(sc);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
802 e1.checkLvalue(sc);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
803 return this;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
804 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
805
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
806 void toBuffer(inout tchar[] buf)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
807 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
808 e1.toBuffer(buf);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
809 buf ~= Token.toString(op);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
810 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
811
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
812 void toIR(IRstate *irs, uint ret)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
813 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
814 uint base;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
815 IR property;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
816 int opoff;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
817
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
818 //writef("PostDecExp::toIR('%s')\n", toChars());
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
819 e1.toLvalue(irs, base, &property, opoff);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
820 assert(opoff != 3);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
821 if (opoff == 2)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
822 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
823 if (ret)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
824 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
825 irs.gen2(loc, IRpostdecscope, ret, property.index);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
826 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
827 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
828 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
829 //irs.gen2(loc, IRpredecscope, ret, property.index);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
830 irs.gen3(loc, IRpredecscope, ret, property.index, property.id.toHash());
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
831 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
832 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
833 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
834 irs.gen3(loc, (ret ? IRpostdec : IRpredec) + opoff, ret, base, property.index);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
835 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
836 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
837
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
838 /************************************************************/
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
839
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
840 class DotExp : UnaExp
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
841 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
842 Identifier *ident;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
843
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
844 this(Loc loc, Expression e, Identifier *ident)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
845 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
846 super(loc, TOKdot, e);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
847 this.ident = ident;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
848 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
849
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
850 void checkLvalue(Scope *sc)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
851 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
852 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
853
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
854 void toBuffer(inout tchar[] buf)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
855 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
856 e1.toBuffer(buf);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
857 buf ~= '.';
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
858 buf ~= ident.toString();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
859 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
860
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
861 void toIR(IRstate *irs, uint ret)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
862 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
863 uint base;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
864
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
865 //writef("DotExp::toIR('%s')\n", toChars());
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
866 version (all)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
867 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
868 // Some test cases depend on things like:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
869 // foo.bar;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
870 // generating a property get even if the result is thrown away.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
871 base = irs.alloc(1);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
872 e1.toIR(irs, base);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
873 irs.gen3(loc, IRgets, ret, base, cast(uint)ident);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
874 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
875 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
876 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
877 if (ret)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
878 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
879 base = irs.alloc(1);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
880 e1.toIR(irs, base);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
881 irs.gen3(loc, IRgets, ret, base, cast(uint)ident);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
882 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
883 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
884 e1.toIR(irs, 0);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
885 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
886 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
887
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
888 void toLvalue(IRstate *irs, out uint base, IR *property, out int opoff)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
889 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
890 base = irs.alloc(1);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
891 e1.toIR(irs, base);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
892 property.id = ident;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
893 opoff = 1;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
894 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
895 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
896
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
897 /************************************************************/
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
898
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
899 class CallExp : UnaExp
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
900 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
901 Expression[] arguments;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
902
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
903 this(Loc loc, Expression e, Expression[] arguments)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
904 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
905 //writef("CallExp(e1 = %x)\n", e);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
906 super(loc, TOKcall, e);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
907 this.arguments = arguments;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
908 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
909
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
910 Expression semantic(Scope *sc)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
911 { IdentifierExpression ie;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
912
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
913 //writef("CallExp(e1=%x, %d, vptr=%x)\n", e1, e1.op, *(uint *)e1);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
914 //writef("CallExp(e1='%s')\n", e1.toString());
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
915 e1 = e1.semantic(sc);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
916 if (e1.op != TOKcall)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
917 e1.checkLvalue(sc);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
918
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
919 foreach (inout Expression e; arguments)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
920 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
921 e = e.semantic(sc);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
922 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
923 if (arguments.length == 1)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
924 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
925 if (e1.op == TOKidentifier)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
926 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
927 ie = cast(IdentifierExpression )e1;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
928 if (ie.ident.toString() == "assert")
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
929 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
930 return new AssertExp(loc, arguments[0]);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
931 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
932 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
933 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
934 return this;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
935 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
936
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
937 void toBuffer(inout tchar[] buf)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
938 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
939 e1.toBuffer(buf);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
940 buf ~= '(';
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
941 for (size_t u = 0; u < arguments.length; u++)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
942 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
943 if (u)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
944 buf ~= ", ";
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
945 arguments[u].toBuffer(buf);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
946 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
947 buf ~= ')';
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
948 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
949
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
950 void toIR(IRstate *irs, uint ret)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
951 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
952 // ret = base.property(argc, argv)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
953 // CALL ret,base,property,argc,argv
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
954 uint base;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
955 uint argc;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
956 uint argv;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
957 IR property;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
958 int opoff;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
959
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
960 //writef("CallExp::toIR('%s')\n", toChars());
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
961 e1.toLvalue(irs, base, &property, opoff);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
962
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
963 if (arguments.length)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
964 { uint u;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
965
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
966 argc = arguments.length;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
967 argv = irs.alloc(argc);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
968 for (u = 0; u < argc; u++)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
969 { Expression e;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
970
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
971 e = arguments[u];
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
972 e.toIR(irs, argv + u * INDEX_FACTOR);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
973 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
974 arguments[] = null; // release to GC
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
975 arguments = null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
976 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
977 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
978 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
979 argc = 0;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
980 argv = 0;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
981 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
982
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
983 if (opoff == 3)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
984 irs.gen4(loc, IRcallv, ret,base,argc,argv);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
985 else if (opoff == 2)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
986 irs.gen4(loc, IRcallscope, ret,property.index,argc,argv);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
987 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
988 irs.gen(loc, IRcall + opoff, 5, ret,base,property,argc,argv);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
989 irs.release(argv, argc);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
990 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
991 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
992
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
993 /************************************************************/
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
994
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
995 class AssertExp : UnaExp
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
996 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
997 this(Loc loc, Expression e)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
998 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
999 super(loc, TOKassert, e);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1000 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1001
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1002 void toBuffer(inout tchar[] buf)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1003 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1004 buf ~= "assert(";
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1005 e1.toBuffer(buf);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1006 buf ~= ')';
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1007 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1008
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1009 void toIR(IRstate *irs, uint ret)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1010 { uint linnum;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1011 uint u;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1012 uint b;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1013
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1014 b = ret ? ret : irs.alloc(1);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1015
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1016 e1.toIR(irs, b);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1017 u = irs.getIP();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1018 irs.gen2(loc, IRjt, 0, b);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1019 linnum = cast(uint)loc;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1020 irs.gen1(loc, IRassert, linnum);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1021 irs.patchJmp(u, irs.getIP());
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1022
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1023 if (!ret)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1024 irs.release(b, 1);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1025 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1026 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1027
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1028 /************************* NewExp ***********************************/
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1029
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1030 class NewExp : UnaExp
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1031 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1032 Expression[] arguments;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1033
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1034 this(Loc loc, Expression e, Expression[] arguments)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1035 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1036 super(loc, TOKnew, e);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1037 this.arguments = arguments;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1038 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1039
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1040 Expression semantic(Scope *sc)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1041 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1042 e1 = e1.semantic(sc);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1043 for (size_t a = 0; a < arguments.length; a++)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1044 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1045 arguments[a] = arguments[a].semantic(sc);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1046 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1047 return this;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1048 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1049
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1050 void toBuffer(inout tchar[] buf)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1051 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1052 buf ~= Token.toString(op);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1053 buf ~= ' ';
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1054
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1055 e1.toBuffer(buf);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1056 buf ~= '(';
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1057 for (size_t a = 0; a < arguments.length; a++)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1058 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1059 arguments[a].toBuffer(buf);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1060 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1061 buf ~= ')';
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1062 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1063
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1064 void toIR(IRstate *irs, uint ret)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1065 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1066 // ret = new b(argc, argv)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1067 // CALL ret,b,argc,argv
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1068 uint b;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1069 uint argc;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1070 uint argv;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1071
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1072 //writef("NewExp::toIR('%s')\n", toChars());
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1073 b = irs.alloc(1);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1074 e1.toIR(irs, b);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1075 if (arguments.length)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1076 { uint u;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1077
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1078 argc = arguments.length;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1079 argv = irs.alloc(argc);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1080 for (u = 0; u < argc; u++)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1081 { Expression e;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1082
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1083 e = arguments[u];
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1084 e.toIR(irs, argv + u * INDEX_FACTOR);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1085 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1086 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1087 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1088 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1089 argc = 0;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1090 argv = 0;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1091 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1092
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1093 irs.gen4(loc, IRnew, ret,b,argc,argv);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1094 irs.release(argv, argc);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1095 irs.release(b, 1);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1096 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1097 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1098
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1099 /************************************************************/
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1100
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1101 class XUnaExp : UnaExp
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1102 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1103 uint ircode;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1104
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1105 this(Loc loc, TOK op, uint ircode, Expression e)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1106 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1107 super(loc, op, e);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1108 this.ircode = ircode;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1109 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1110
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1111 void toIR(IRstate *irs, uint ret)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1112 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1113 e1.toIR(irs, ret);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1114 if (ret)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1115 irs.gen1(loc, ircode, ret);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1116 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1117 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1118
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1119 class NotExp : XUnaExp
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1120 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1121 this(Loc loc, Expression e)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1122 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1123 super(loc, TOKnot, IRnot, e);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1124 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1125
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1126 int isBooleanResult()
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1127 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1128 return true;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1129 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1130 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1131
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1132 class DeleteExp : UnaExp
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1133 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1134 this(Loc loc, Expression e)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1135 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1136 super(loc, TOKdelete, e);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1137 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1138
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1139 Expression semantic(Scope *sc)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1140 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1141 e1.checkLvalue(sc);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1142 return this;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1143 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1144
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1145 void toIR(IRstate *irs, uint ret)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1146 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1147 uint base;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1148 IR property;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1149 int opoff;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1150
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1151 e1.toLvalue(irs, base, &property, opoff);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1152 assert(opoff != 3);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1153 if (opoff == 2)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1154 irs.gen2(loc, IRdelscope, ret, property.index);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1155 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1156 irs.gen3(loc, IRdel + opoff, ret, base, property.index);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1157 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1158 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1159
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1160 /************************* CommaExp ***********************************/
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1161
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1162 class CommaExp : BinExp
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1163 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1164 this(Loc loc, Expression e1, Expression e2)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1165 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1166 super(loc, TOKcomma, e1, e2);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1167 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1168
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1169 void checkLvalue(Scope *sc)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1170 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1171 e2.checkLvalue(sc);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1172 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1173
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1174 void toIR(IRstate *irs, uint ret)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1175 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1176 e1.toIR(irs, 0);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1177 e2.toIR(irs, ret);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1178 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1179 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1180
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1181 /************************* ArrayExp ***********************************/
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1182
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1183 class ArrayExp : BinExp
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1184 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1185 this(Loc loc, Expression e1, Expression e2)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1186 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1187 super(loc, TOKarray, e1, e2);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1188 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1189
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1190 Expression semantic(Scope *sc)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1191 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1192 checkLvalue(sc);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1193 return this;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1194 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1195
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1196 void checkLvalue(Scope *sc)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1197 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1198 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1199
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1200 void toBuffer(inout tchar[] buf)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1201 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1202 e1.toBuffer(buf);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1203 buf ~= '[';
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1204 e2.toBuffer(buf);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1205 buf ~= ']';
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1206 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1207
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1208 void toIR(IRstate *irs, uint ret)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1209 { uint base;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1210 IR property;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1211 int opoff;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1212
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1213 if (ret)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1214 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1215 toLvalue(irs, base, &property, opoff);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1216 assert(opoff != 3);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1217 if (opoff == 2)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1218 irs.gen2(loc, IRgetscope, ret, property.index);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1219 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1220 irs.gen3(loc, IRget + opoff, ret, base, property.index);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1221 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1222 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1223 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1224 e1.toIR(irs, 0);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1225 e2.toIR(irs, 0);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1226 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1227 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1228
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1229 void toLvalue(IRstate *irs, out uint base, IR *property, out int opoff)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1230 { uint index;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1231
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1232 base = irs.alloc(1);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1233 e1.toIR(irs, base);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1234 index = irs.alloc(1);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1235 e2.toIR(irs, index);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1236 property.index = index;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1237 opoff = 0;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1238 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1239 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1240
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1241 /************************* AssignExp ***********************************/
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1242
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1243 class AssignExp : BinExp
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1244 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1245 this(Loc loc, Expression e1, Expression e2)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1246 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1247 super(loc, TOKassign, e1, e2);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1248 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1249
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1250 Expression semantic(Scope *sc)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1251 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1252 //writefln("AssignExp.semantic()");
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1253 super.semantic(sc);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1254 if (e1.op != TOKcall) // special case for CallExp lvalue's
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1255 e1.checkLvalue(sc);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1256 return this;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1257 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1258
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1259 void toIR(IRstate *irs, uint ret)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1260 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1261 uint b;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1262
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1263 //writef("AssignExp::toIR('%s')\n", toChars());
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1264 if (e1.op == TOKcall) // if CallExp
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1265 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1266 assert(cast(CallExp)(e1)); // make sure we got it right
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1267
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1268 // Special case a function call as an lvalue.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1269 // This can happen if:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1270 // foo() = 3;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1271 // A Microsoft extension, it means to assign 3 to the default property of
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1272 // the object returned by foo(). It only has meaning for com objects.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1273 // This functionality should be worked into toLvalue() if it gets used
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1274 // elsewhere.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1275
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1276 uint base;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1277 uint argc;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1278 uint argv;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1279 IR property;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1280 int opoff;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1281 CallExp ec = cast(CallExp)e1;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1282
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1283 if (ec.arguments.length)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1284 argc = ec.arguments.length + 1;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1285 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1286 argc = 1;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1287
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1288 argv = irs.alloc(argc);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1289
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1290 e2.toIR(irs, argv + (argc - 1) * INDEX_FACTOR);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1291
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1292 ec.e1.toLvalue(irs, base, &property, opoff);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1293
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1294 if (ec.arguments.length)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1295 { uint u;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1296
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1297 for (u = 0; u < ec.arguments.length; u++)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1298 { Expression e;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1299
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1300 e = ec.arguments[u];
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1301 e.toIR(irs, argv + (u + 0) * INDEX_FACTOR);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1302 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1303 ec.arguments[] = null; // release to GC
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1304 ec.arguments = null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1305 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1306
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1307 if (opoff == 3)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1308 irs.gen4(loc, IRputcallv, ret,base,argc,argv);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1309 else if (opoff == 2)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1310 irs.gen4(loc, IRputcallscope, ret,property.index,argc,argv);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1311 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1312 irs.gen(loc, IRputcall + opoff, 5, ret,base,property,argc,argv);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1313 irs.release(argv, argc);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1314 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1315 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1316 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1317 uint base;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1318 IR property;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1319 int opoff;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1320
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1321 b = ret ? ret : irs.alloc(1);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1322 e2.toIR(irs, b);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1323
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1324 e1.toLvalue(irs, base, &property, opoff);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1325 assert(opoff != 3);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1326 if (opoff == 2)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1327 irs.gen2(loc, IRputscope, b, property.index);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1328 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1329 irs.gen3(loc, IRput + opoff, b, base, property.index);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1330 if (!ret)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1331 irs.release(b, 1);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1332 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1333 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1334 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1335
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1336 /************************* AddAssignExp ***********************************/
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1337
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1338 class AddAssignExp : BinExp
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1339 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1340 this(Loc loc, Expression e1, Expression e2)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1341 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1342 super(loc, TOKplusass, e1, e2);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1343 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1344
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1345 Expression semantic(Scope *sc)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1346 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1347 super.semantic(sc);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1348 e1.checkLvalue(sc);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1349 return this;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1350 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1351
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1352 void toIR(IRstate *irs, uint ret)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1353 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1354 if (ret == 0 && e2.op == TOKreal &&
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1355 (cast(RealExpression)e2).value == 1)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1356 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1357 uint base;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1358 IR property;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1359 int opoff;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1360
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1361 //writef("AddAssign to PostInc('%s')\n", toChars());
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1362 e1.toLvalue(irs, base, &property, opoff);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1363 assert(opoff != 3);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1364 if (opoff == 2)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1365 irs.gen2(loc, IRpostincscope, ret, property.index);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1366 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1367 irs.gen3(loc, IRpostinc + opoff, ret, base, property.index);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1368 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1369 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1370 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1371 uint r;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1372 uint base;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1373 IR property;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1374 int opoff;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1375
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1376 //writef("AddAssignExp::toIR('%s')\n", toChars());
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1377 e1.toLvalue(irs, base, &property, opoff);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1378 assert(opoff != 3);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1379 r = ret ? ret : irs.alloc(1);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1380 e2.toIR(irs, r);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1381 if (opoff == 2)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1382 irs.gen3(loc, IRaddassscope, r, property.index, property.id.toHash());
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1383 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1384 irs.gen3(loc, IRaddass + opoff, r, base, property.index);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1385 if (!ret)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1386 irs.release(r, 1);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1387 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1388 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1389 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1390
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1391 /************************* BinAssignExp ***********************************/
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1392
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1393 class BinAssignExp : BinExp
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1394 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1395 uint ircode = IRerror;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1396
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1397 this(Loc loc, TOK op, uint ircode, Expression e1, Expression e2)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1398 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1399 super(loc, op, e1, e2);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1400 this.ircode = ircode;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1401 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1402
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1403 Expression semantic(Scope *sc)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1404 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1405 super.semantic(sc);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1406 e1.checkLvalue(sc);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1407 return this;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1408 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1409
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1410 void toIR(IRstate *irs, uint ret)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1411 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1412 uint b;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1413 uint c;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1414 uint r;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1415 uint base;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1416 IR property;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1417 int opoff;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1418
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1419 //writef("BinExp::binAssignIR('%s')\n", toChars());
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1420 e1.toLvalue(irs, base, &property, opoff);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1421 assert(opoff != 3);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1422 b = irs.alloc(1);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1423 if (opoff == 2)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1424 irs.gen2(loc, IRgetscope, b, property.index);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1425 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1426 irs.gen3(loc, IRget + opoff, b, base, property.index);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1427 c = irs.alloc(1);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1428 e2.toIR(irs, c);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1429 r = ret ? ret : irs.alloc(1);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1430 irs.gen3(loc, ircode, r, b, c);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1431 if (opoff == 2)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1432 irs.gen2(loc, IRputscope, r, property.index);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1433 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1434 irs.gen3(loc, IRput + opoff, r, base, property.index);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1435 if (!ret)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1436 irs.release(r, 1);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1437 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1438 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1439
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1440 /************************* AddExp *****************************/
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1441
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1442 class AddExp : BinExp
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1443 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1444 this(Loc loc, Expression e1, Expression e2)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1445 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1446 super(loc, TOKplus, e1, e2);;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1447 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1448
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1449 Expression semantic(Scope *sc)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1450 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1451 return this;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1452 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1453
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1454 void toIR(IRstate *irs, uint ret)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1455 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1456 binIR(irs, ret, IRadd);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1457 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1458 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1459
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1460 /************************* XBinExp ***********************************/
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1461
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1462 class XBinExp : BinExp
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1463 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1464 uint ircode = IRerror;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1465
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1466 this(Loc loc, TOK op, uint ircode, Expression e1, Expression e2)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1467 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1468 super(loc, op, e1, e2);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1469 this.ircode = ircode;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1470 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1471
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1472 void toIR(IRstate *irs, uint ret)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1473 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1474 binIR(irs, ret, ircode);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1475 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1476 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1477
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1478 /************************* OrOrExp ***********************************/
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1479
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1480 class OrOrExp : BinExp
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1481 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1482 this(Loc loc, Expression e1, Expression e2)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1483 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1484 super(loc, TOKoror, e1, e2);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1485 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1486
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1487 void toIR(IRstate *irs, uint ret)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1488 { uint u;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1489 uint b;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1490
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1491 if (ret)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1492 b = ret;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1493 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1494 b = irs.alloc(1);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1495
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1496 e1.toIR(irs, b);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1497 u = irs.getIP();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1498 irs.gen2(loc, IRjt, 0, b);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1499 e2.toIR(irs, ret);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1500 irs.patchJmp(u, irs.getIP());
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1501
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1502 if (!ret)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1503 irs.release(b, 1);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1504 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1505 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1506
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1507 /************************* AndAndExp ***********************************/
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1508
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1509 class AndAndExp : BinExp
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1510 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1511 this(Loc loc, Expression e1, Expression e2)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1512 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1513 super(loc, TOKandand, e1, e2);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1514 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1515
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1516 void toIR(IRstate *irs, uint ret)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1517 { uint u;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1518 uint b;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1519
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1520 if (ret)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1521 b = ret;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1522 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1523 b = irs.alloc(1);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1524
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1525 e1.toIR(irs, b);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1526 u = irs.getIP();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1527 irs.gen2(loc, IRjf, 0, b);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1528 e2.toIR(irs, ret);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1529 irs.patchJmp(u, irs.getIP());
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1530
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1531 if (!ret)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1532 irs.release(b, 1);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1533 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1534 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1535
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1536 /************************* CmpExp ***********************************/
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1537
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1538
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1539
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1540 class CmpExp : BinExp
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1541 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1542 uint ircode = IRerror;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1543
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1544 this(Loc loc, TOK tok, uint ircode, Expression e1, Expression e2)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1545 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1546 super(loc, tok, e1, e2);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1547 this.ircode = ircode;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1548 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1549
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1550 int isBooleanResult()
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1551 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1552 return true;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1553 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1554
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1555 void toIR(IRstate *irs, uint ret)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1556 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1557 binIR(irs, ret, ircode);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1558 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1559 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1560
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1561 /*************************** InExp **************************/
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1562
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1563 class InExp : BinExp
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1564 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1565 this(Loc loc, Expression e1, Expression e2)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1566 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1567 super(loc, TOKin, e1, e2);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1568 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1569 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1570
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1571 /****************************************************************/
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1572
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1573 class CondExp : BinExp
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1574 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1575 Expression econd;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1576
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1577 this(Loc loc, Expression econd, Expression e1, Expression e2)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1578 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1579 super(loc, TOKquestion, e1, e2);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1580 this.econd = econd;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1581 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1582
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1583 void toIR(IRstate *irs, uint ret)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1584 { uint u1;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1585 uint u2;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1586 uint b;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1587
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1588 if (ret)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1589 b = ret;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1590 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1591 b = irs.alloc(1);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1592
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1593 econd.toIR(irs, b);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1594 u1 = irs.getIP();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1595 irs.gen2(loc, IRjf, 0, b);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1596 e1.toIR(irs, ret);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1597 u2 = irs.getIP();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1598 irs.gen1(loc, IRjmp, 0);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1599 irs.patchJmp(u1, irs.getIP());
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1600 e2.toIR(irs, ret);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1601 irs.patchJmp(u2, irs.getIP());
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1602
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1603 if (!ret)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1604 irs.release(b, 1);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1605 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1606 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1607