annotate dmd/interpret/Util.d @ 179:cd48cb899aee

Updated to dmd2.040
author korDen
date Sun, 17 Oct 2010 20:56:07 +0400
parents fe2e1b93e88f
children
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;
179
cd48cb899aee Updated to dmd2.040
korDen
parents: 148
diff changeset
9 import dmd.StringExp;
63
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
10 import dmd.GlobalExpressions;
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
11 import dmd.TOK;
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
12 import dmd.AssocArrayLiteralExp;
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
13 import dmd.IntegerExp;
179
cd48cb899aee Updated to dmd2.040
korDen
parents: 148
diff changeset
14 import dmd.Id;
63
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
15 import dmd.Type;
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
16 import dmd.Declaration;
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
17 import dmd.Loc;
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
18 import dmd.ArrayLiteralExp;
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
19 import dmd.TypeAArray;
107
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
20 import dmd.TypeFunction;
63
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
21 import dmd.TypeSArray;
107
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
22 import dmd.TY;
63
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
23 import dmd.STC;
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
24 import dmd.SymbolDeclaration;
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
25 import dmd.StructLiteralExp;
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
26 import dmd.VarDeclaration;
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
27 import dmd.Util;
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
28
179
cd48cb899aee Updated to dmd2.040
korDen
parents: 148
diff changeset
29 import core.memory;
cd48cb899aee Updated to dmd2.040
korDen
parents: 148
diff changeset
30 import core.stdc.string;
cd48cb899aee Updated to dmd2.040
korDen
parents: 148
diff changeset
31
107
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
32 version(DMDV1)
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
33 {
63
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
34 Expression interpret_aaLen(InterState istate, Expressions arguments)
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
35 {
107
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
36 if (!arguments || arguments.dim != 1)
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 earg = arguments[0];
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
39 earg = earg.interpret(istate);
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
40 if (earg is EXP_CANT_INTERPRET)
63
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
41 return null;
107
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
42 if (earg.op != TOKassocarrayliteral)
63
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
43 return null;
107
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
44 auto aae = cast(AssocArrayLiteralExp)earg;
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
45 auto e = new IntegerExp(aae.loc, aae.keys.dim, Type.tsize_t);
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
46 return e;
63
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
47 }
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
48
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
49 Expression interpret_aaKeys(InterState istate, Expressions arguments)
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
50 {
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
51 version (LOG) {
107
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
52 writef("interpret_aaKeys()\n");
63
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
53 }
107
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
54 if (!arguments || arguments.dim != 2)
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 earg = arguments[0];
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
57 earg = earg.interpret(istate);
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
58 if (earg is EXP_CANT_INTERPRET)
63
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
59 return null;
107
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
60 if (earg.op != TOKassocarrayliteral)
63
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
61 return null;
107
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
62 auto aae = cast(AssocArrayLiteralExp)earg;
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
63 auto e = new ArrayLiteralExp(aae.loc, aae.keys);
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
64 Type elemType = (cast(TypeAArray)aae.type).index;
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
65 e.type = new TypeSArray(elemType, new IntegerExp(arguments ? arguments.dim : 0));
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
66 return e;
63
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
67 }
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
68
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
69 Expression interpret_aaValues(InterState istate, Expressions arguments)
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
70 {
107
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
71 //writef("interpret_aaValues()\n");
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
72 if (!arguments || arguments.dim != 3)
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
73 return null;
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
74 auto earg = arguments[0];
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
75 earg = earg.interpret(istate);
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
76 if (earg is EXP_CANT_INTERPRET)
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
77 return null;
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
78 if (earg.op != TOKassocarrayliteral)
63
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
79 return null;
107
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
80 auto aae = cast(AssocArrayLiteralExp)earg;
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
81 auto e = new ArrayLiteralExp(aae.loc, aae.values);
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
82 Type elemType = (cast(TypeAArray)aae.type).next;
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
83 e.type = new TypeSArray(elemType, new IntegerExp(arguments ? arguments.dim : 0));
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
84 //writef("result is %s\n", e.toChars());
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
85 return e;
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
86 }
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
87 }
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
88 else version(DMDV2)
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
89 {
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
90 Expression interpret_length(InterState istate, Expression earg)
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
91 {
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
92 // writef("interpret_length()\n");
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
93 earg = earg.interpret(istate);
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
94 if (earg == EXP_CANT_INTERPRET)
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
95 return null;
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
96 if (earg.op != TOKassocarrayliteral)
63
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
97 return null;
107
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
98 AssocArrayLiteralExp aae = cast(AssocArrayLiteralExp)earg;
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
99 Expression e = new IntegerExp(aae.loc, aae.keys.dim, Type.tsize_t);
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
100 return e;
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
101 }
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
102
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
103 Expression interpret_keys(InterState istate, Expression earg, FuncDeclaration fd)
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
104 {
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
105 version(LOG)
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
106 writef("interpret_keys()\n");
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
107
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
108 earg = earg.interpret(istate);
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
109 if (earg == EXP_CANT_INTERPRET)
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
110 return null;
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
111 if (earg.op != TOKassocarrayliteral)
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
112 return null;
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
113 AssocArrayLiteralExp aae = cast(AssocArrayLiteralExp)earg;
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
114 Expression e = new ArrayLiteralExp(aae.loc, aae.keys);
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
115 assert(fd.type.ty == Tfunction);
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
116 assert(fd.type.nextOf().ty == Tarray);
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
117 Type elemType = (cast(TypeFunction)fd.type).nextOf().nextOf();
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
118 e.type = new TypeSArray(elemType, new IntegerExp(aae.keys.dim));
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
119 return e;
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
120 }
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
121 Expression interpret_values(InterState istate, Expression earg, FuncDeclaration fd)
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
122 {
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
123 //writef("interpret_values()\n");
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
124 earg = earg.interpret(istate);
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
125 if (earg == EXP_CANT_INTERPRET)
63
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
126 return null;
107
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
127 if (earg.op != TOKassocarrayliteral)
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
128 return null;
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
129 AssocArrayLiteralExp aae = cast(AssocArrayLiteralExp)earg;
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
130 Expression e = new ArrayLiteralExp(aae.loc, aae.values);
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
131 assert(fd.type.ty == Tfunction);
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
132 assert(fd.type.nextOf().ty == Tarray);
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
133 Type elemType = (cast(TypeFunction)fd.type).nextOf().nextOf();
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
134 e.type = new TypeSArray(elemType, new IntegerExp(aae.values.dim));
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
135 //writef("result is %s\n", e.toChars());
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
136 return e;
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
137 }
63
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
138 }
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
139
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
140 Expression getVarExp(Loc loc, InterState istate, Declaration d)
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
141 {
107
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
142 Expression e = EXP_CANT_INTERPRET;
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
143 VarDeclaration v = d.isVarDeclaration();
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
144 SymbolDeclaration s = d.isSymbolDeclaration();
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
145 if (v)
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
146 {
63
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
147 ///version (DMDV2) {
179
cd48cb899aee Updated to dmd2.040
korDen
parents: 148
diff changeset
148 /* Magic variable __ctfe always returns true when interpreting
cd48cb899aee Updated to dmd2.040
korDen
parents: 148
diff changeset
149 */
cd48cb899aee Updated to dmd2.040
korDen
parents: 148
diff changeset
150 if (v.ident == Id.ctfe)
cd48cb899aee Updated to dmd2.040
korDen
parents: 148
diff changeset
151 return new IntegerExp(loc, 1, Type.tbool);
cd48cb899aee Updated to dmd2.040
korDen
parents: 148
diff changeset
152
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
153 if ((v.isConst() || v.isImmutable() || v.storage_class & STCmanifest) && v.init && !v.value)
63
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
154 ///} else {
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
155 /// if (v.isConst() && v.init)
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
156 ///}
148
fe2e1b93e88f phobos compiles now:
Trass3r
parents: 135
diff changeset
157 {
63
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
158 e = v.init.toExpression();
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
159 if (e && !e.type)
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
160 e.type = v.type;
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
161 }
179
cd48cb899aee Updated to dmd2.040
korDen
parents: 148
diff changeset
162 else if (v.isCTFE() && !v.value)
cd48cb899aee Updated to dmd2.040
korDen
parents: 148
diff changeset
163 {
cd48cb899aee Updated to dmd2.040
korDen
parents: 148
diff changeset
164 if (v.init)
cd48cb899aee Updated to dmd2.040
korDen
parents: 148
diff changeset
165 {
cd48cb899aee Updated to dmd2.040
korDen
parents: 148
diff changeset
166 e = v.init.toExpression();
cd48cb899aee Updated to dmd2.040
korDen
parents: 148
diff changeset
167 e = e.interpret(istate);
cd48cb899aee Updated to dmd2.040
korDen
parents: 148
diff changeset
168 }
cd48cb899aee Updated to dmd2.040
korDen
parents: 148
diff changeset
169 else // This should never happen
cd48cb899aee Updated to dmd2.040
korDen
parents: 148
diff changeset
170 e = v.type.defaultInitLiteral(Loc(0));
cd48cb899aee Updated to dmd2.040
korDen
parents: 148
diff changeset
171 }
cd48cb899aee Updated to dmd2.040
korDen
parents: 148
diff changeset
172
63
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
173 else
148
fe2e1b93e88f phobos compiles now:
Trass3r
parents: 135
diff changeset
174 {
63
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
175 e = v.value;
148
fe2e1b93e88f phobos compiles now:
Trass3r
parents: 135
diff changeset
176 if (!v.isCTFE())
fe2e1b93e88f phobos compiles now:
Trass3r
parents: 135
diff changeset
177 {
63
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
178 error(loc, "static variable %s cannot be read at compile time", v.toChars());
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
179 e = EXP_CANT_INTERPRET;
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
180 }
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
181 else if (!e)
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
182 error(loc, "variable %s is used before initialization", v.toChars());
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
183 else if (e !is EXP_CANT_INTERPRET)
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
184 e = e.interpret(istate);
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
185 }
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
186 if (!e)
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
187 e = EXP_CANT_INTERPRET;
107
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
188 }
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
189 else if (s)
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
190 {
63
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
191 if (s.dsym.toInitializer() == s.sym)
148
fe2e1b93e88f phobos compiles now:
Trass3r
parents: 135
diff changeset
192 {
63
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
193 Expressions exps = new Expressions();
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
194 e = new StructLiteralExp(Loc(0), s.dsym, exps);
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
195 e = e.semantic(null);
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
196 }
107
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
197 }
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
198 return e;
63
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 /* Helper functions for BinExp.interpretAssignCommon
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
202 */
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
203
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
204 /***************************************
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
205 * Duplicate the elements array, then set field 'indexToChange' = newelem.
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
206 */
84
be2ab491772e Expressions -> Vector!Expression
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 79
diff changeset
207 Expressions changeOneElement(Expressions oldelems, size_t indexToChange, Expression newelem)
63
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
208 {
107
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
209 auto expsx = new Expressions();
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
210 expsx.setDim(oldelems.dim);
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
211 for (size_t j = 0; j < expsx.dim; j++)
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
212 {
63
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
213 if (j == indexToChange)
84
be2ab491772e Expressions -> Vector!Expression
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 79
diff changeset
214 expsx[j] = newelem;
63
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
215 else
84
be2ab491772e Expressions -> Vector!Expression
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 79
diff changeset
216 expsx[j] = oldelems[j];
107
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
217 }
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
218 return expsx;
63
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
219 }
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
220
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
221 /***************************************
179
cd48cb899aee Updated to dmd2.040
korDen
parents: 148
diff changeset
222 * Returns oldelems[0..insertpoint] ~ newelems ~ oldelems[insertpoint+newelems.length..$]
63
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
223 */
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
224 Expressions spliceElements(Expressions oldelems, Expressions newelems, size_t insertpoint)
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
225 {
107
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
226 auto expsx = new Expressions();
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
227 expsx.setDim(oldelems.dim);
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
228 for (size_t j = 0; j < expsx.dim; j++)
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
229 {
63
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
230 if (j >= insertpoint && j < insertpoint + newelems.dim)
84
be2ab491772e Expressions -> Vector!Expression
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 79
diff changeset
231 expsx[j] = newelems[j - insertpoint];
63
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
232 else
84
be2ab491772e Expressions -> Vector!Expression
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 79
diff changeset
233 expsx[j] = oldelems[j];
107
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
234 }
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
235 return expsx;
63
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
236 }
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
237
179
cd48cb899aee Updated to dmd2.040
korDen
parents: 148
diff changeset
238 /***************************************
cd48cb899aee Updated to dmd2.040
korDen
parents: 148
diff changeset
239 * Returns oldstr[0..insertpoint] ~ newstr ~ oldstr[insertpoint+newlen..$]
cd48cb899aee Updated to dmd2.040
korDen
parents: 148
diff changeset
240 */
cd48cb899aee Updated to dmd2.040
korDen
parents: 148
diff changeset
241 StringExp spliceStringExp(StringExp oldstr, StringExp newstr, size_t insertpoint)
cd48cb899aee Updated to dmd2.040
korDen
parents: 148
diff changeset
242 {
cd48cb899aee Updated to dmd2.040
korDen
parents: 148
diff changeset
243 assert(oldstr.sz==newstr.sz);
cd48cb899aee Updated to dmd2.040
korDen
parents: 148
diff changeset
244 char* s;
cd48cb899aee Updated to dmd2.040
korDen
parents: 148
diff changeset
245 size_t oldlen = oldstr.len;
cd48cb899aee Updated to dmd2.040
korDen
parents: 148
diff changeset
246 size_t newlen = newstr.len;
cd48cb899aee Updated to dmd2.040
korDen
parents: 148
diff changeset
247 size_t sz = oldstr.sz;
cd48cb899aee Updated to dmd2.040
korDen
parents: 148
diff changeset
248 s = cast(char*)GC.calloc(oldlen + 1, sz);
cd48cb899aee Updated to dmd2.040
korDen
parents: 148
diff changeset
249 memcpy(s, oldstr.string_, oldlen * sz);
cd48cb899aee Updated to dmd2.040
korDen
parents: 148
diff changeset
250 memcpy(s + insertpoint * sz, newstr.string_, newlen * sz);
cd48cb899aee Updated to dmd2.040
korDen
parents: 148
diff changeset
251 StringExp se2 = new StringExp(oldstr.loc, cast(string)s[0..oldlen]);
cd48cb899aee Updated to dmd2.040
korDen
parents: 148
diff changeset
252 se2.committed = oldstr.committed;
cd48cb899aee Updated to dmd2.040
korDen
parents: 148
diff changeset
253 se2.postfix = oldstr.postfix;
cd48cb899aee Updated to dmd2.040
korDen
parents: 148
diff changeset
254 se2.type = oldstr.type;
cd48cb899aee Updated to dmd2.040
korDen
parents: 148
diff changeset
255 return se2;
cd48cb899aee Updated to dmd2.040
korDen
parents: 148
diff changeset
256 }
cd48cb899aee Updated to dmd2.040
korDen
parents: 148
diff changeset
257
cd48cb899aee Updated to dmd2.040
korDen
parents: 148
diff changeset
258 /******************************
cd48cb899aee Updated to dmd2.040
korDen
parents: 148
diff changeset
259 * Create a string literal consisting of 'value' duplicated 'dim' times.
cd48cb899aee Updated to dmd2.040
korDen
parents: 148
diff changeset
260 */
cd48cb899aee Updated to dmd2.040
korDen
parents: 148
diff changeset
261 StringExp createBlockDuplicatedStringLiteral(Type type, dchar value, size_t dim, int sz)
cd48cb899aee Updated to dmd2.040
korDen
parents: 148
diff changeset
262 {
cd48cb899aee Updated to dmd2.040
korDen
parents: 148
diff changeset
263 char* s;
cd48cb899aee Updated to dmd2.040
korDen
parents: 148
diff changeset
264 s = cast(char*)GC.calloc(dim + 1, sz);
cd48cb899aee Updated to dmd2.040
korDen
parents: 148
diff changeset
265 for (int elemi = 0; elemi < dim; ++elemi)
cd48cb899aee Updated to dmd2.040
korDen
parents: 148
diff changeset
266 {
cd48cb899aee Updated to dmd2.040
korDen
parents: 148
diff changeset
267 switch (sz)
cd48cb899aee Updated to dmd2.040
korDen
parents: 148
diff changeset
268 {
cd48cb899aee Updated to dmd2.040
korDen
parents: 148
diff changeset
269 case 1: s[elemi] = cast(char)value; break;
cd48cb899aee Updated to dmd2.040
korDen
parents: 148
diff changeset
270 case 2: (cast(wchar*)s)[elemi] = cast(wchar)value; break;
cd48cb899aee Updated to dmd2.040
korDen
parents: 148
diff changeset
271 case 4: (cast(dchar*)s)[elemi] = value; break;
cd48cb899aee Updated to dmd2.040
korDen
parents: 148
diff changeset
272 default: assert(0);
cd48cb899aee Updated to dmd2.040
korDen
parents: 148
diff changeset
273 }
cd48cb899aee Updated to dmd2.040
korDen
parents: 148
diff changeset
274 }
cd48cb899aee Updated to dmd2.040
korDen
parents: 148
diff changeset
275 StringExp se = new StringExp(Loc(0), cast(string)s[0..dim]);
cd48cb899aee Updated to dmd2.040
korDen
parents: 148
diff changeset
276 se.type = type;
cd48cb899aee Updated to dmd2.040
korDen
parents: 148
diff changeset
277 return se;
cd48cb899aee Updated to dmd2.040
korDen
parents: 148
diff changeset
278 }
cd48cb899aee Updated to dmd2.040
korDen
parents: 148
diff changeset
279
63
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
280 /******************************
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
281 * Create an array literal consisting of 'elem' duplicated 'dim' times.
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
282 */
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
283 ArrayLiteralExp createBlockDuplicatedArrayLiteral(Type type, Expression elem, size_t dim)
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
284 {
107
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
285 auto elements = new Expressions();
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
286 elements.setDim(dim);
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
287 for (size_t i = 0; i < dim; i++) {
84
be2ab491772e Expressions -> Vector!Expression
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 79
diff changeset
288 elements[i] = elem;
63
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
289 }
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
290
107
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
291 auto ae = new ArrayLiteralExp(Loc(0), elements);
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
292 ae.type = type;
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
293 return ae;
63
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
294 }
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
295
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
296
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
297 /********************************
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
298 * Add v to the istate list, unless it already exists there.
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
299 */
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
300 void addVarToInterstate(InterState istate, VarDeclaration v)
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
301 {
107
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
302 if (!v.isParameter())
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
303 {
63
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
304 for (size_t i = 0; 1; i++)
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
305 {
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
306 if (i == istate.vars.dim)
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
307 {
74
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 63
diff changeset
308 istate.vars.push(v);
107
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
309 //writef("\tadding %s to istate\n", v.toChars());
63
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
310 break;
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
311 }
74
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 63
diff changeset
312 if (v == cast(VarDeclaration)istate.vars[i])
63
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
313 break;
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
314 }
107
d8f19d85fadb changes from interpret.c
Trass3r
parents: 84
diff changeset
315 }
63
cab4c37afb89 A bunch of implementations
korDen
parents:
diff changeset
316 }