annotate dmd/interpret/Util.d @ 107:d8f19d85fadb

changes from interpret.c
author Trass3r
date Tue, 31 Aug 2010 18:18:31 +0200
parents be2ab491772e
children e28b18c23469
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
63
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
1 module dmd.interpret.Util;
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
2
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
3 import dmd.StructDeclaration;
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
4 import dmd.Expression;
107
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
5 import dmd.FuncDeclaration;
63
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
6 import dmd.InterState;
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
7 import dmd.ArrayTypes;
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
8 import dmd.GlobalExpressions;
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
9 import dmd.TOK;
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
10 import dmd.AssocArrayLiteralExp;
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
11 import dmd.IntegerExp;
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
12 import dmd.Type;
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
13 import dmd.Declaration;
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
14 import dmd.Loc;
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
15 import dmd.ArrayLiteralExp;
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
16 import dmd.TypeAArray;
107
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
17 import dmd.TypeFunction;
63
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
18 import dmd.TypeSArray;
107
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
19 import dmd.TY;
63
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
20 import dmd.STC;
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
21 import dmd.SymbolDeclaration;
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
22 import dmd.StructLiteralExp;
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
23 import dmd.VarDeclaration;
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
24 import dmd.Util;
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
25
107
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
26 version(DMDV1)
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
27 {
63
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
28 Expression interpret_aaLen(InterState istate, Expressions arguments)
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
29 {
107
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
30 if (!arguments || arguments.dim != 1)
63
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
31 return null;
107
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
32 auto earg = arguments[0];
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
33 earg = earg.interpret(istate);
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
34 if (earg is EXP_CANT_INTERPRET)
63
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
35 return null;
107
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
36 if (earg.op != TOKassocarrayliteral)
63
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
37 return null;
107
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
38 auto aae = cast(AssocArrayLiteralExp)earg;
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
39 auto e = new IntegerExp(aae.loc, aae.keys.dim, Type.tsize_t);
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
40 return e;
63
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
41 }
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
42
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
43 Expression interpret_aaKeys(InterState istate, Expressions arguments)
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
44 {
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
45 version (LOG) {
107
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
46 writef("interpret_aaKeys()\n");
63
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
47 }
107
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
48 if (!arguments || arguments.dim != 2)
63
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
49 return null;
107
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
50 auto earg = arguments[0];
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
51 earg = earg.interpret(istate);
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
52 if (earg is EXP_CANT_INTERPRET)
63
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
53 return null;
107
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
54 if (earg.op != TOKassocarrayliteral)
63
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
55 return null;
107
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
56 auto aae = cast(AssocArrayLiteralExp)earg;
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
57 auto e = new ArrayLiteralExp(aae.loc, aae.keys);
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
58 Type elemType = (cast(TypeAArray)aae.type).index;
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
59 e.type = new TypeSArray(elemType, new IntegerExp(arguments ? arguments.dim : 0));
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
60 return e;
63
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
61 }
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
62
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
63 Expression interpret_aaValues(InterState istate, Expressions arguments)
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
64 {
107
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
65 //writef("interpret_aaValues()\n");
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
66 if (!arguments || arguments.dim != 3)
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
67 return null;
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
68 auto earg = arguments[0];
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
69 earg = earg.interpret(istate);
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
70 if (earg is EXP_CANT_INTERPRET)
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
71 return null;
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
72 if (earg.op != TOKassocarrayliteral)
63
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
73 return null;
107
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
74 auto aae = cast(AssocArrayLiteralExp)earg;
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
75 auto e = new ArrayLiteralExp(aae.loc, aae.values);
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
76 Type elemType = (cast(TypeAArray)aae.type).next;
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
77 e.type = new TypeSArray(elemType, new IntegerExp(arguments ? arguments.dim : 0));
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
78 //writef("result is %s\n", e.toChars());
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
79 return e;
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
80 }
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
81 }
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
82 else version(DMDV2)
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
83 {
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
84 Expression interpret_length(InterState istate, Expression earg)
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
85 {
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
86 // writef("interpret_length()\n");
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
87 earg = earg.interpret(istate);
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
88 if (earg == EXP_CANT_INTERPRET)
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
89 return null;
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
90 if (earg.op != TOKassocarrayliteral)
63
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
91 return null;
107
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
92 AssocArrayLiteralExp aae = cast(AssocArrayLiteralExp)earg;
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
93 Expression e = new IntegerExp(aae.loc, aae.keys.dim, Type.tsize_t);
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
94 return e;
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
95 }
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
96
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
97 Expression interpret_keys(InterState istate, Expression earg, FuncDeclaration fd)
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
98 {
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
99 version(LOG)
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
100 writef("interpret_keys()\n");
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
101
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
102 earg = earg.interpret(istate);
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
103 if (earg == EXP_CANT_INTERPRET)
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
104 return null;
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
105 if (earg.op != TOKassocarrayliteral)
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
106 return null;
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
107 AssocArrayLiteralExp aae = cast(AssocArrayLiteralExp)earg;
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
108 Expression e = new ArrayLiteralExp(aae.loc, aae.keys);
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
109 assert(fd.type.ty == Tfunction);
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
110 assert(fd.type.nextOf().ty == Tarray);
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
111 Type elemType = (cast(TypeFunction)fd.type).nextOf().nextOf();
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
112 e.type = new TypeSArray(elemType, new IntegerExp(aae.keys.dim));
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
113 return e;
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
114 }
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
115 Expression interpret_values(InterState istate, Expression earg, FuncDeclaration fd)
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
116 {
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
117 //writef("interpret_values()\n");
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
118 earg = earg.interpret(istate);
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
119 if (earg == EXP_CANT_INTERPRET)
63
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
120 return null;
107
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
121 if (earg.op != TOKassocarrayliteral)
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
122 return null;
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
123 AssocArrayLiteralExp aae = cast(AssocArrayLiteralExp)earg;
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
124 Expression e = new ArrayLiteralExp(aae.loc, aae.values);
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
125 assert(fd.type.ty == Tfunction);
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
126 assert(fd.type.nextOf().ty == Tarray);
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
127 Type elemType = (cast(TypeFunction)fd.type).nextOf().nextOf();
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
128 e.type = new TypeSArray(elemType, new IntegerExp(aae.values.dim));
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
129 //writef("result is %s\n", e.toChars());
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
130 return e;
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
131 }
63
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
132 }
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
133
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
134 Expression getVarExp(Loc loc, InterState istate, Declaration d)
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
135 {
107
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
136 Expression e = EXP_CANT_INTERPRET;
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
137 VarDeclaration v = d.isVarDeclaration();
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
138 SymbolDeclaration s = d.isSymbolDeclaration();
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
139 if (v)
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
140 {
63
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
141 ///version (DMDV2) {
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
142 if ((v.isConst() || v.isInvariant() || v.storage_class & STCmanifest) && v.init && !v.value)
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
143 ///} else {
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
144 /// if (v.isConst() && v.init)
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
145 ///}
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
146 {
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
147 e = v.init.toExpression();
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
148 if (e && !e.type)
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
149 e.type = v.type;
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
150 }
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
151 else
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
152 {
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
153 e = v.value;
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
154 if (v.isDataseg())
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
155 {
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
156 error(loc, "static variable %s cannot be read at compile time", v.toChars());
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
157 e = EXP_CANT_INTERPRET;
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
158 }
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
159 else if (!e)
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
160 error(loc, "variable %s is used before initialization", v.toChars());
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
161 else if (e !is EXP_CANT_INTERPRET)
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
162 e = e.interpret(istate);
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
163 }
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
164 if (!e)
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
165 e = EXP_CANT_INTERPRET;
107
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
166 }
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
167 else if (s)
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
168 {
63
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
169 if (s.dsym.toInitializer() == s.sym)
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
170 {
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
171 Expressions exps = new Expressions();
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
172 e = new StructLiteralExp(Loc(0), s.dsym, exps);
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
173 e = e.semantic(null);
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
174 }
107
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
175 }
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
176 return e;
63
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
177 }
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
178
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
179 /* Helper functions for BinExp.interpretAssignCommon
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
180 */
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
181
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
182 /***************************************
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
183 * Duplicate the elements array, then set field 'indexToChange' = newelem.
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
184 */
84
be2ab491772e Expressions -> Vector!Expression
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 79
diff changeset
185 Expressions changeOneElement(Expressions oldelems, size_t indexToChange, Expression newelem)
63
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
186 {
107
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
187 auto expsx = new Expressions();
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
188 expsx.setDim(oldelems.dim);
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
189 for (size_t j = 0; j < expsx.dim; j++)
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
190 {
63
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
191 if (j == indexToChange)
84
be2ab491772e Expressions -> Vector!Expression
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 79
diff changeset
192 expsx[j] = newelem;
63
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
193 else
84
be2ab491772e Expressions -> Vector!Expression
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 79
diff changeset
194 expsx[j] = oldelems[j];
107
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
195 }
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
196 return expsx;
63
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
197 }
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
198
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
199 /***************************************
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
200 * Returns oldelems[0..insertpoint] ~ newelems ~ oldelems[insertpoint..$]
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
201 */
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
202 Expressions spliceElements(Expressions oldelems, Expressions newelems, size_t insertpoint)
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
203 {
107
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
204 auto expsx = new Expressions();
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
205 expsx.setDim(oldelems.dim);
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
206 for (size_t j = 0; j < expsx.dim; j++)
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
207 {
63
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
208 if (j >= insertpoint && j < insertpoint + newelems.dim)
84
be2ab491772e Expressions -> Vector!Expression
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 79
diff changeset
209 expsx[j] = newelems[j - insertpoint];
63
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
210 else
84
be2ab491772e Expressions -> Vector!Expression
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 79
diff changeset
211 expsx[j] = oldelems[j];
107
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
212 }
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
213 return expsx;
63
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
214 }
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
215
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
216 /******************************
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
217 * Create an array literal consisting of 'elem' duplicated 'dim' times.
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
218 */
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
219 ArrayLiteralExp createBlockDuplicatedArrayLiteral(Type type, Expression elem, size_t dim)
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
220 {
107
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
221 auto elements = new Expressions();
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
222 elements.setDim(dim);
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
223 for (size_t i = 0; i < dim; i++) {
84
be2ab491772e Expressions -> Vector!Expression
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 79
diff changeset
224 elements[i] = elem;
63
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
225 }
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
226
107
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
227 auto ae = new ArrayLiteralExp(Loc(0), elements);
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
228 ae.type = type;
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
229 return ae;
63
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
230 }
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
231
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
232
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
233 /********************************
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
234 * Necessary because defaultInit() for a struct is a VarExp, not a StructLiteralExp.
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
235 */
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
236 StructLiteralExp createDefaultInitStructLiteral(Loc loc, StructDeclaration sym)
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
237 {
107
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
238 Expressions structelems = new Expressions();
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
239 structelems.setDim(sym.fields.dim);
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
240 for (size_t j = 0; j < structelems.dim; j++)
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
241 {
84
be2ab491772e Expressions -> Vector!Expression
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 79
diff changeset
242 structelems[j] = sym.fields[j].type.defaultInit(Loc(0));
107
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
243 }
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
244 StructLiteralExp structinit = new StructLiteralExp(loc, sym, structelems);
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
245 // Why doesn't the StructLiteralExp constructor do this, when
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
246 // sym.type != null ?
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
247 structinit.type = sym.type;
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
248 return structinit;
63
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
249 }
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
250
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
251 /********************************
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
252 * Add v to the istate list, unless it already exists there.
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
253 */
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
254 void addVarToInterstate(InterState istate, VarDeclaration v)
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
255 {
107
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
256 if (!v.isParameter())
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
257 {
63
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
258 for (size_t i = 0; 1; i++)
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
259 {
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
260 if (i == istate.vars.dim)
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
261 {
74
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 63
diff changeset
262 istate.vars.push(v);
107
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
263 //writef("\tadding %s to istate\n", v.toChars());
63
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
264 break;
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
265 }
74
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 63
diff changeset
266 if (v == cast(VarDeclaration)istate.vars[i])
63
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
267 break;
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
268 }
107
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
269 }
63
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
270 }