annotate dmd/interpret/Util.d @ 135:af1bebfd96a4 dmd2037

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