annotate dmd/AssocArrayLiteralExp.d @ 68:ee3a9f34dc48

final bits of codegen implementation to compile Phobos
author korDen
date Tue, 24 Aug 2010 16:44:34 +0400
parents 4290d870944a
children 2e2a5c3f943a
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1 module dmd.AssocArrayLiteralExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3 import dmd.Expression;
64
4290d870944a More fixes
korDen
parents: 63
diff changeset
4 import dmd.GlobalExpressions;
4290d870944a More fixes
korDen
parents: 63
diff changeset
5 import dmd.WANT;
4290d870944a More fixes
korDen
parents: 63
diff changeset
6 import dmd.expression.Equal;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
7 import dmd.backend.elem;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
8 import dmd.InterState;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
9 import dmd.MATCH;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
10 import dmd.Type;
20
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
11 import dmd.TypeAArray;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
12 import dmd.OutBuffer;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
13 import dmd.Loc;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
14 import dmd.Scope;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
15 import dmd.InlineCostState;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
16 import dmd.IRState;
64
4290d870944a More fixes
korDen
parents: 63
diff changeset
17 import dmd.TY;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
18 import dmd.InlineDoState;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
19 import dmd.HdrGenState;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
20 import dmd.InlineScanState;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
21 import dmd.ArrayTypes;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
22 import dmd.TOK;
20
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
23 import dmd.PREC;
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
24 import dmd.expression.Util;
68
ee3a9f34dc48 final bits of codegen implementation to compile Phobos
korDen
parents: 64
diff changeset
25 import dmd.backend.Util;
ee3a9f34dc48 final bits of codegen implementation to compile Phobos
korDen
parents: 64
diff changeset
26 import dmd.backend.TYM;
ee3a9f34dc48 final bits of codegen implementation to compile Phobos
korDen
parents: 64
diff changeset
27 import dmd.backend.mTY;
ee3a9f34dc48 final bits of codegen implementation to compile Phobos
korDen
parents: 64
diff changeset
28 import dmd.backend.OPER;
ee3a9f34dc48 final bits of codegen implementation to compile Phobos
korDen
parents: 64
diff changeset
29 import dmd.backend.RTLSYM;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
30
20
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
31 class AssocArrayLiteralExp : Expression
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
32 {
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
33 Expressions keys;
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
34 Expressions values;
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
35
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
36 this(Loc loc, Expressions keys, Expressions values)
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
37 {
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
38 super(loc, TOK.TOKassocarrayliteral, this.sizeof);
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
39 assert(keys.dim == values.dim);
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
40 this.keys = keys;
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
41 this.values = values;
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
42 }
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
43
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
44 Expression syntaxCopy()
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
45 {
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
46 return new AssocArrayLiteralExp(loc,
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
47 arraySyntaxCopy(keys), arraySyntaxCopy(values));
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
48 }
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
49
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
50 Expression semantic(Scope sc)
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
51 {
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
52 Expression e;
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
53 Type tkey = null;
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
54 Type tvalue = null;
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
55
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
56 version (LOGSEMANTIC) {
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
57 printf("AssocArrayLiteralExp.semantic('%s')\n", toChars());
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
58 }
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
59
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
60 // Run semantic() on each element
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
61 for (size_t i = 0; i < keys.dim; i++)
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
62 { Expression key = cast(Expression)keys.data[i];
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
63 Expression value = cast(Expression)values.data[i];
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
64
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
65 key = key.semantic(sc);
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
66 value = value.semantic(sc);
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
67
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
68 keys.data[i] = cast(void *)key;
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
69 values.data[i] = cast(void *)value;
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
70 }
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
71 expandTuples(keys);
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
72 expandTuples(values);
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
73 if (keys.dim != values.dim)
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
74 {
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
75 error("number of keys is %u, must match number of values %u", keys.dim, values.dim);
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
76 keys.setDim(0);
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
77 values.setDim(0);
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
78 }
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
79 for (size_t i = 0; i < keys.dim; i++)
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
80 { Expression key = cast(Expression)keys.data[i];
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
81 Expression value = cast(Expression)values.data[i];
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
82
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
83 if (!key.type)
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
84 error("%s has no value", key.toChars());
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
85 if (!value.type)
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
86 error("%s has no value", value.toChars());
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
87 key = resolveProperties(sc, key);
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
88 value = resolveProperties(sc, value);
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
89
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
90 if (!tkey)
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
91 tkey = key.type;
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
92 else
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
93 key = key.implicitCastTo(sc, tkey);
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
94 keys.data[i] = cast(void *)key;
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
95
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
96 if (!tvalue)
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
97 tvalue = value.type;
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
98 else
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
99 value = value.implicitCastTo(sc, tvalue);
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
100 values.data[i] = cast(void *)value;
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
101 }
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
102
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
103 if (!tkey)
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
104 tkey = Type.tvoid;
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
105 if (!tvalue)
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
106 tvalue = Type.tvoid;
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
107 type = new TypeAArray(tvalue, tkey);
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
108 type = type.semantic(loc, sc);
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
109 return this;
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
110 }
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
111
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
112 bool isBool(bool result)
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
113 {
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
114 size_t dim = keys.dim;
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
115 return result ? (dim != 0) : (dim == 0);
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
116 }
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
117
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
118 elem* toElem(IRState* irs)
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
119 {
68
ee3a9f34dc48 final bits of codegen implementation to compile Phobos
korDen
parents: 64
diff changeset
120 elem* e;
ee3a9f34dc48 final bits of codegen implementation to compile Phobos
korDen
parents: 64
diff changeset
121 size_t dim;
ee3a9f34dc48 final bits of codegen implementation to compile Phobos
korDen
parents: 64
diff changeset
122
ee3a9f34dc48 final bits of codegen implementation to compile Phobos
korDen
parents: 64
diff changeset
123 //printf("AssocArrayLiteralExp.toElem() %s\n", toChars());
ee3a9f34dc48 final bits of codegen implementation to compile Phobos
korDen
parents: 64
diff changeset
124 dim = keys.dim;
ee3a9f34dc48 final bits of codegen implementation to compile Phobos
korDen
parents: 64
diff changeset
125 e = el_long(TYint, dim);
ee3a9f34dc48 final bits of codegen implementation to compile Phobos
korDen
parents: 64
diff changeset
126 for (size_t i = 0; i < dim; i++)
ee3a9f34dc48 final bits of codegen implementation to compile Phobos
korDen
parents: 64
diff changeset
127 {
ee3a9f34dc48 final bits of codegen implementation to compile Phobos
korDen
parents: 64
diff changeset
128 Expression el = cast(Expression)keys.data[i];
ee3a9f34dc48 final bits of codegen implementation to compile Phobos
korDen
parents: 64
diff changeset
129
ee3a9f34dc48 final bits of codegen implementation to compile Phobos
korDen
parents: 64
diff changeset
130 for (int j = 0; j < 2; j++)
ee3a9f34dc48 final bits of codegen implementation to compile Phobos
korDen
parents: 64
diff changeset
131 {
ee3a9f34dc48 final bits of codegen implementation to compile Phobos
korDen
parents: 64
diff changeset
132 elem* ep = el.toElem(irs);
ee3a9f34dc48 final bits of codegen implementation to compile Phobos
korDen
parents: 64
diff changeset
133
ee3a9f34dc48 final bits of codegen implementation to compile Phobos
korDen
parents: 64
diff changeset
134 if (tybasic(ep.Ety) == TYstruct || tybasic(ep.Ety) == TYarray)
ee3a9f34dc48 final bits of codegen implementation to compile Phobos
korDen
parents: 64
diff changeset
135 {
ee3a9f34dc48 final bits of codegen implementation to compile Phobos
korDen
parents: 64
diff changeset
136 ep = el_una(OPstrpar, TYstruct, ep);
ee3a9f34dc48 final bits of codegen implementation to compile Phobos
korDen
parents: 64
diff changeset
137 ep.Enumbytes = cast(uint)el.type.size();
ee3a9f34dc48 final bits of codegen implementation to compile Phobos
korDen
parents: 64
diff changeset
138 }
ee3a9f34dc48 final bits of codegen implementation to compile Phobos
korDen
parents: 64
diff changeset
139 //printf("[%d] %s\n", i, el.toChars());
ee3a9f34dc48 final bits of codegen implementation to compile Phobos
korDen
parents: 64
diff changeset
140 //elem_print(ep);
ee3a9f34dc48 final bits of codegen implementation to compile Phobos
korDen
parents: 64
diff changeset
141 e = el_param(ep, e);
ee3a9f34dc48 final bits of codegen implementation to compile Phobos
korDen
parents: 64
diff changeset
142 el = cast(Expression)values.data[i];
ee3a9f34dc48 final bits of codegen implementation to compile Phobos
korDen
parents: 64
diff changeset
143 }
ee3a9f34dc48 final bits of codegen implementation to compile Phobos
korDen
parents: 64
diff changeset
144 }
ee3a9f34dc48 final bits of codegen implementation to compile Phobos
korDen
parents: 64
diff changeset
145
ee3a9f34dc48 final bits of codegen implementation to compile Phobos
korDen
parents: 64
diff changeset
146 Type t = type.toBasetype().mutableOf();
ee3a9f34dc48 final bits of codegen implementation to compile Phobos
korDen
parents: 64
diff changeset
147 assert(t.ty == Taarray);
ee3a9f34dc48 final bits of codegen implementation to compile Phobos
korDen
parents: 64
diff changeset
148 TypeAArray ta = cast(TypeAArray)t;
ee3a9f34dc48 final bits of codegen implementation to compile Phobos
korDen
parents: 64
diff changeset
149
ee3a9f34dc48 final bits of codegen implementation to compile Phobos
korDen
parents: 64
diff changeset
150 /* Unfortunately, the hash function for Aa (array of chars) is custom and
ee3a9f34dc48 final bits of codegen implementation to compile Phobos
korDen
parents: 64
diff changeset
151 * different from Axa and Aya, which get the generic hash function.
ee3a9f34dc48 final bits of codegen implementation to compile Phobos
korDen
parents: 64
diff changeset
152 * So, rewrite the type of the AArray so that if it's key type
ee3a9f34dc48 final bits of codegen implementation to compile Phobos
korDen
parents: 64
diff changeset
153 * is an array of const or invariant, make it an array of mutable.
ee3a9f34dc48 final bits of codegen implementation to compile Phobos
korDen
parents: 64
diff changeset
154 */
ee3a9f34dc48 final bits of codegen implementation to compile Phobos
korDen
parents: 64
diff changeset
155 Type tkey = ta.index.toBasetype();
ee3a9f34dc48 final bits of codegen implementation to compile Phobos
korDen
parents: 64
diff changeset
156 if (tkey.ty == Tarray)
ee3a9f34dc48 final bits of codegen implementation to compile Phobos
korDen
parents: 64
diff changeset
157 {
ee3a9f34dc48 final bits of codegen implementation to compile Phobos
korDen
parents: 64
diff changeset
158 tkey = tkey.nextOf().mutableOf().arrayOf();
ee3a9f34dc48 final bits of codegen implementation to compile Phobos
korDen
parents: 64
diff changeset
159 tkey = tkey.semantic(Loc(0), null);
ee3a9f34dc48 final bits of codegen implementation to compile Phobos
korDen
parents: 64
diff changeset
160 ta = new TypeAArray(ta.nextOf(), tkey);
ee3a9f34dc48 final bits of codegen implementation to compile Phobos
korDen
parents: 64
diff changeset
161 ta = cast(TypeAArray)ta.merge();
ee3a9f34dc48 final bits of codegen implementation to compile Phobos
korDen
parents: 64
diff changeset
162 }
ee3a9f34dc48 final bits of codegen implementation to compile Phobos
korDen
parents: 64
diff changeset
163
ee3a9f34dc48 final bits of codegen implementation to compile Phobos
korDen
parents: 64
diff changeset
164 e = el_param(e, ta.getTypeInfo(null).toElem(irs));
ee3a9f34dc48 final bits of codegen implementation to compile Phobos
korDen
parents: 64
diff changeset
165
ee3a9f34dc48 final bits of codegen implementation to compile Phobos
korDen
parents: 64
diff changeset
166 // call _d_assocarrayliteralT(ti, dim, ...)
ee3a9f34dc48 final bits of codegen implementation to compile Phobos
korDen
parents: 64
diff changeset
167 e = el_bin(OPcall,TYnptr,el_var(rtlsym[RTLSYM_ASSOCARRAYLITERALT]),e);
ee3a9f34dc48 final bits of codegen implementation to compile Phobos
korDen
parents: 64
diff changeset
168
ee3a9f34dc48 final bits of codegen implementation to compile Phobos
korDen
parents: 64
diff changeset
169 el_setLoc(e,loc);
ee3a9f34dc48 final bits of codegen implementation to compile Phobos
korDen
parents: 64
diff changeset
170 return e;
20
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
171 }
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
172
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
173 bool checkSideEffect(int flag)
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
174 {
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
175 bool f = false;
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
176
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
177 for (size_t i = 0; i < keys.dim; i++)
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
178 { Expression key = cast(Expression)keys.data[i];
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
179 Expression value = cast(Expression)values.data[i];
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
180
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
181 f |= key.checkSideEffect(2);
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
182 f |= value.checkSideEffect(2);
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
183 }
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
184 if (flag == 0 && f == 0)
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
185 Expression.checkSideEffect(0);
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
186 return f;
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
187 }
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
188
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
189 void toCBuffer(OutBuffer buf, HdrGenState* hgs)
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
190 {
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
191 buf.writeByte('[');
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
192 for (size_t i = 0; i < keys.dim; i++)
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
193 { Expression key = cast(Expression)keys.data[i];
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
194 Expression value = cast(Expression)values.data[i];
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
195
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
196 if (i)
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
197 buf.writeByte(',');
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
198 expToCBuffer(buf, hgs, key, PREC.PREC_assign);
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
199 buf.writeByte(':');
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
200 expToCBuffer(buf, hgs, value, PREC.PREC_assign);
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
201 }
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
202 buf.writeByte(']');
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
203 }
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
204
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
205 void toMangleBuffer(OutBuffer buf)
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
206 {
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
207 size_t dim = keys.dim;
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
208 buf.printf("A%u", dim);
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
209 for (size_t i = 0; i < dim; i++)
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
210 { Expression key = cast(Expression)keys.data[i];
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
211 Expression value = cast(Expression)values.data[i];
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
212
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
213 key.toMangleBuffer(buf);
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
214 value.toMangleBuffer(buf);
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
215 }
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
216 }
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
217
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
218 void scanForNestedRef(Scope sc)
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
219 {
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
220 assert(false);
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
221 }
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
222
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
223 Expression optimize(int result)
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
224 {
64
4290d870944a More fixes
korDen
parents: 63
diff changeset
225 assert(keys.dim == values.dim);
4290d870944a More fixes
korDen
parents: 63
diff changeset
226 for (size_t i = 0; i < keys.dim; i++)
4290d870944a More fixes
korDen
parents: 63
diff changeset
227 {
4290d870944a More fixes
korDen
parents: 63
diff changeset
228 Expression e = cast(Expression)keys.data[i];
4290d870944a More fixes
korDen
parents: 63
diff changeset
229
4290d870944a More fixes
korDen
parents: 63
diff changeset
230 e = e.optimize(WANTvalue | (result & WANTinterpret));
4290d870944a More fixes
korDen
parents: 63
diff changeset
231 keys.data[i] = cast(void*)e;
4290d870944a More fixes
korDen
parents: 63
diff changeset
232
4290d870944a More fixes
korDen
parents: 63
diff changeset
233 e = cast(Expression)values.data[i];
4290d870944a More fixes
korDen
parents: 63
diff changeset
234 e = e.optimize(WANTvalue | (result & WANTinterpret));
4290d870944a More fixes
korDen
parents: 63
diff changeset
235 values.data[i] = cast(void*)e;
4290d870944a More fixes
korDen
parents: 63
diff changeset
236 }
4290d870944a More fixes
korDen
parents: 63
diff changeset
237 return this;
20
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
238 }
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
239
63
cab4c37afb89 A bunch of implementations
korDen
parents: 23
diff changeset
240 Expression interpret(InterState istate)
20
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
241 {
64
4290d870944a More fixes
korDen
parents: 63
diff changeset
242 Expressions keysx = keys;
4290d870944a More fixes
korDen
parents: 63
diff changeset
243 Expressions valuesx = values;
4290d870944a More fixes
korDen
parents: 63
diff changeset
244
4290d870944a More fixes
korDen
parents: 63
diff changeset
245 version (LOG) {
4290d870944a More fixes
korDen
parents: 63
diff changeset
246 printf("AssocArrayLiteralExp.interpret() %s\n", toChars());
4290d870944a More fixes
korDen
parents: 63
diff changeset
247 }
4290d870944a More fixes
korDen
parents: 63
diff changeset
248 for (size_t i = 0; i < keys.dim; i++)
4290d870944a More fixes
korDen
parents: 63
diff changeset
249 {
4290d870944a More fixes
korDen
parents: 63
diff changeset
250 Expression ekey = cast(Expression)keys.data[i];
4290d870944a More fixes
korDen
parents: 63
diff changeset
251 Expression evalue = cast(Expression)values.data[i];
4290d870944a More fixes
korDen
parents: 63
diff changeset
252 Expression ex;
4290d870944a More fixes
korDen
parents: 63
diff changeset
253
4290d870944a More fixes
korDen
parents: 63
diff changeset
254 ex = ekey.interpret(istate);
4290d870944a More fixes
korDen
parents: 63
diff changeset
255 if (ex is EXP_CANT_INTERPRET)
4290d870944a More fixes
korDen
parents: 63
diff changeset
256 goto Lerr;
4290d870944a More fixes
korDen
parents: 63
diff changeset
257
4290d870944a More fixes
korDen
parents: 63
diff changeset
258 /* If any changes, do Copy On Write
4290d870944a More fixes
korDen
parents: 63
diff changeset
259 */
4290d870944a More fixes
korDen
parents: 63
diff changeset
260 if (ex != ekey)
4290d870944a More fixes
korDen
parents: 63
diff changeset
261 {
4290d870944a More fixes
korDen
parents: 63
diff changeset
262 if (keysx == keys)
4290d870944a More fixes
korDen
parents: 63
diff changeset
263 keysx = cast(Expressions)keys.copy();
4290d870944a More fixes
korDen
parents: 63
diff changeset
264 keysx.data[i] = cast(void*)ex;
4290d870944a More fixes
korDen
parents: 63
diff changeset
265 }
4290d870944a More fixes
korDen
parents: 63
diff changeset
266
4290d870944a More fixes
korDen
parents: 63
diff changeset
267 ex = evalue.interpret(istate);
4290d870944a More fixes
korDen
parents: 63
diff changeset
268 if (ex is EXP_CANT_INTERPRET)
4290d870944a More fixes
korDen
parents: 63
diff changeset
269 goto Lerr;
4290d870944a More fixes
korDen
parents: 63
diff changeset
270
4290d870944a More fixes
korDen
parents: 63
diff changeset
271 /* If any changes, do Copy On Write
4290d870944a More fixes
korDen
parents: 63
diff changeset
272 */
4290d870944a More fixes
korDen
parents: 63
diff changeset
273 if (ex != evalue)
4290d870944a More fixes
korDen
parents: 63
diff changeset
274 {
4290d870944a More fixes
korDen
parents: 63
diff changeset
275 if (valuesx == values)
4290d870944a More fixes
korDen
parents: 63
diff changeset
276 valuesx = cast(Expressions)values.copy();
4290d870944a More fixes
korDen
parents: 63
diff changeset
277 valuesx.data[i] = cast(void*)ex;
4290d870944a More fixes
korDen
parents: 63
diff changeset
278 }
4290d870944a More fixes
korDen
parents: 63
diff changeset
279 }
4290d870944a More fixes
korDen
parents: 63
diff changeset
280
4290d870944a More fixes
korDen
parents: 63
diff changeset
281 if (keysx != keys)
4290d870944a More fixes
korDen
parents: 63
diff changeset
282 expandTuples(keysx);
4290d870944a More fixes
korDen
parents: 63
diff changeset
283 if (valuesx != values)
4290d870944a More fixes
korDen
parents: 63
diff changeset
284 expandTuples(valuesx);
4290d870944a More fixes
korDen
parents: 63
diff changeset
285 if (keysx.dim != valuesx.dim)
4290d870944a More fixes
korDen
parents: 63
diff changeset
286 goto Lerr;
4290d870944a More fixes
korDen
parents: 63
diff changeset
287
4290d870944a More fixes
korDen
parents: 63
diff changeset
288 /* Remove duplicate keys
4290d870944a More fixes
korDen
parents: 63
diff changeset
289 */
4290d870944a More fixes
korDen
parents: 63
diff changeset
290 for (size_t i = 1; i < keysx.dim; i++)
4290d870944a More fixes
korDen
parents: 63
diff changeset
291 {
4290d870944a More fixes
korDen
parents: 63
diff changeset
292 Expression ekey = cast(Expression)keysx.data[i - 1];
4290d870944a More fixes
korDen
parents: 63
diff changeset
293
4290d870944a More fixes
korDen
parents: 63
diff changeset
294 for (size_t j = i; j < keysx.dim; j++)
4290d870944a More fixes
korDen
parents: 63
diff changeset
295 {
4290d870944a More fixes
korDen
parents: 63
diff changeset
296 Expression ekey2 = cast(Expression)keysx.data[j];
4290d870944a More fixes
korDen
parents: 63
diff changeset
297 Expression ex = Equal(TOKequal, Type.tbool, ekey, ekey2);
4290d870944a More fixes
korDen
parents: 63
diff changeset
298 if (ex is EXP_CANT_INTERPRET)
4290d870944a More fixes
korDen
parents: 63
diff changeset
299 goto Lerr;
4290d870944a More fixes
korDen
parents: 63
diff changeset
300 if (ex.isBool(true)) // if a match
4290d870944a More fixes
korDen
parents: 63
diff changeset
301 {
4290d870944a More fixes
korDen
parents: 63
diff changeset
302 // Remove ekey
4290d870944a More fixes
korDen
parents: 63
diff changeset
303 if (keysx == keys)
4290d870944a More fixes
korDen
parents: 63
diff changeset
304 keysx = cast(Expressions)keys.copy();
4290d870944a More fixes
korDen
parents: 63
diff changeset
305 if (valuesx == values)
4290d870944a More fixes
korDen
parents: 63
diff changeset
306 valuesx = cast(Expressions)values.copy();
4290d870944a More fixes
korDen
parents: 63
diff changeset
307 keysx.remove(i - 1);
4290d870944a More fixes
korDen
parents: 63
diff changeset
308 valuesx.remove(i - 1);
4290d870944a More fixes
korDen
parents: 63
diff changeset
309 i -= 1; // redo the i'th iteration
4290d870944a More fixes
korDen
parents: 63
diff changeset
310 break;
4290d870944a More fixes
korDen
parents: 63
diff changeset
311 }
4290d870944a More fixes
korDen
parents: 63
diff changeset
312 }
4290d870944a More fixes
korDen
parents: 63
diff changeset
313 }
4290d870944a More fixes
korDen
parents: 63
diff changeset
314
4290d870944a More fixes
korDen
parents: 63
diff changeset
315 if (keysx != keys || valuesx != values)
4290d870944a More fixes
korDen
parents: 63
diff changeset
316 {
4290d870944a More fixes
korDen
parents: 63
diff changeset
317 AssocArrayLiteralExp ae;
4290d870944a More fixes
korDen
parents: 63
diff changeset
318 ae = new AssocArrayLiteralExp(loc, keysx, valuesx);
4290d870944a More fixes
korDen
parents: 63
diff changeset
319 ae.type = type;
4290d870944a More fixes
korDen
parents: 63
diff changeset
320 return ae;
4290d870944a More fixes
korDen
parents: 63
diff changeset
321 }
4290d870944a More fixes
korDen
parents: 63
diff changeset
322 return this;
4290d870944a More fixes
korDen
parents: 63
diff changeset
323
4290d870944a More fixes
korDen
parents: 63
diff changeset
324 Lerr:
4290d870944a More fixes
korDen
parents: 63
diff changeset
325 if (keysx != keys)
4290d870944a More fixes
korDen
parents: 63
diff changeset
326 delete keysx;
4290d870944a More fixes
korDen
parents: 63
diff changeset
327 if (valuesx != values)
4290d870944a More fixes
korDen
parents: 63
diff changeset
328 delete values;
4290d870944a More fixes
korDen
parents: 63
diff changeset
329 return EXP_CANT_INTERPRET;
20
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
330 }
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
331
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
332 MATCH implicitConvTo(Type t)
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
333 {
64
4290d870944a More fixes
korDen
parents: 63
diff changeset
334 MATCH result = MATCHexact;
4290d870944a More fixes
korDen
parents: 63
diff changeset
335
4290d870944a More fixes
korDen
parents: 63
diff changeset
336 Type typeb = type.toBasetype();
4290d870944a More fixes
korDen
parents: 63
diff changeset
337 Type tb = t.toBasetype();
4290d870944a More fixes
korDen
parents: 63
diff changeset
338 if (tb.ty == Taarray && typeb.ty == Taarray)
4290d870944a More fixes
korDen
parents: 63
diff changeset
339 {
4290d870944a More fixes
korDen
parents: 63
diff changeset
340 for (size_t i = 0; i < keys.dim; i++)
4290d870944a More fixes
korDen
parents: 63
diff changeset
341 {
4290d870944a More fixes
korDen
parents: 63
diff changeset
342 Expression e = cast(Expression)keys.data[i];
4290d870944a More fixes
korDen
parents: 63
diff changeset
343 MATCH m = cast(MATCH)e.implicitConvTo((cast(TypeAArray)tb).index);
4290d870944a More fixes
korDen
parents: 63
diff changeset
344 if (m < result)
4290d870944a More fixes
korDen
parents: 63
diff changeset
345 result = m; // remember worst match
4290d870944a More fixes
korDen
parents: 63
diff changeset
346 if (result == MATCHnomatch)
4290d870944a More fixes
korDen
parents: 63
diff changeset
347 break; // no need to check for worse
4290d870944a More fixes
korDen
parents: 63
diff changeset
348 e = cast(Expression)values.data[i];
4290d870944a More fixes
korDen
parents: 63
diff changeset
349 m = cast(MATCH)e.implicitConvTo(tb.nextOf());
4290d870944a More fixes
korDen
parents: 63
diff changeset
350 if (m < result)
4290d870944a More fixes
korDen
parents: 63
diff changeset
351 result = m; // remember worst match
4290d870944a More fixes
korDen
parents: 63
diff changeset
352 if (result == MATCHnomatch)
4290d870944a More fixes
korDen
parents: 63
diff changeset
353 break; // no need to check for worse
4290d870944a More fixes
korDen
parents: 63
diff changeset
354 }
4290d870944a More fixes
korDen
parents: 63
diff changeset
355 return result;
4290d870944a More fixes
korDen
parents: 63
diff changeset
356 }
4290d870944a More fixes
korDen
parents: 63
diff changeset
357 else
4290d870944a More fixes
korDen
parents: 63
diff changeset
358 return Expression.implicitConvTo(t);
20
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
359 }
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
360
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
361 Expression castTo(Scope sc, Type t)
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
362 {
64
4290d870944a More fixes
korDen
parents: 63
diff changeset
363 if (type == t)
4290d870944a More fixes
korDen
parents: 63
diff changeset
364 return this;
4290d870944a More fixes
korDen
parents: 63
diff changeset
365 AssocArrayLiteralExp e = this;
4290d870944a More fixes
korDen
parents: 63
diff changeset
366 Type typeb = type.toBasetype();
4290d870944a More fixes
korDen
parents: 63
diff changeset
367 Type tb = t.toBasetype();
4290d870944a More fixes
korDen
parents: 63
diff changeset
368 if (tb.ty == Taarray && typeb.ty == Taarray && tb.nextOf().toBasetype().ty != Tvoid)
4290d870944a More fixes
korDen
parents: 63
diff changeset
369 {
4290d870944a More fixes
korDen
parents: 63
diff changeset
370 e = cast(AssocArrayLiteralExp)copy();
4290d870944a More fixes
korDen
parents: 63
diff changeset
371 e.keys = cast(Expressions)keys.copy();
4290d870944a More fixes
korDen
parents: 63
diff changeset
372 e.values = cast(Expressions)values.copy();
4290d870944a More fixes
korDen
parents: 63
diff changeset
373 assert(keys.dim == values.dim);
4290d870944a More fixes
korDen
parents: 63
diff changeset
374 for (size_t i = 0; i < keys.dim; i++)
4290d870944a More fixes
korDen
parents: 63
diff changeset
375 {
4290d870944a More fixes
korDen
parents: 63
diff changeset
376 Expression ex = cast(Expression)values.data[i];
4290d870944a More fixes
korDen
parents: 63
diff changeset
377 ex = ex.castTo(sc, tb.nextOf());
4290d870944a More fixes
korDen
parents: 63
diff changeset
378 e.values.data[i] = cast(void*)ex;
4290d870944a More fixes
korDen
parents: 63
diff changeset
379
4290d870944a More fixes
korDen
parents: 63
diff changeset
380 ex = cast(Expression)keys.data[i];
4290d870944a More fixes
korDen
parents: 63
diff changeset
381 ex = ex.castTo(sc, (cast(TypeAArray)tb).index);
4290d870944a More fixes
korDen
parents: 63
diff changeset
382 e.keys.data[i] = cast(void*)ex;
4290d870944a More fixes
korDen
parents: 63
diff changeset
383 }
4290d870944a More fixes
korDen
parents: 63
diff changeset
384 e.type = t;
4290d870944a More fixes
korDen
parents: 63
diff changeset
385 return e;
4290d870944a More fixes
korDen
parents: 63
diff changeset
386 }
4290d870944a More fixes
korDen
parents: 63
diff changeset
387 L1:
4290d870944a More fixes
korDen
parents: 63
diff changeset
388 return e.Expression.castTo(sc, t);
20
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
389 }
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
390
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
391 bool canThrow()
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
392 {
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
393 return true;
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
394 }
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
395
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
396 int inlineCost(InlineCostState* ics)
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
397 {
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
398 assert(false);
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
399 }
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
400
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
401 Expression doInline(InlineDoState ids)
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
402 {
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
403 assert(false);
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
404 }
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
405
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
406 Expression inlineScan(InlineScanState* iss)
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
407 {
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
408 assert(false);
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
409 }
1628b221808d Fleshed out more unimplemented methods.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
410 }