Mercurial > projects > ldc
comparison dmd/arrayop.c @ 703:06576ece1a1b
Changed premake.lua to work with mingw.
Implemented array operations, not perfect but ok for tonight. closes #89
author | Tomas Lindquist Olsen <tomas.l.olsen@gmail.com> |
---|---|
date | Mon, 13 Oct 2008 23:19:32 +0200 |
parents | eef8ac26c66c |
children | b30fe7e1dbb9 |
comparison
equal
deleted
inserted
replaced
702:353d9d184091 | 703:06576ece1a1b |
---|---|
26 #include "scope.h" | 26 #include "scope.h" |
27 #include "id.h" | 27 #include "id.h" |
28 #include "module.h" | 28 #include "module.h" |
29 #include "init.h" | 29 #include "init.h" |
30 | 30 |
31 // FIXME | |
32 int binary(const char *p , const char **tab, int high) | |
33 { | |
34 assert(0); | |
35 } | |
36 | |
37 /************************************** | |
38 * Hash table of array op functions already generated or known about. | |
39 */ | |
40 | |
41 StringTable arrayfuncs; | |
42 | 31 |
43 /*********************************** | 32 /*********************************** |
44 * Construct the array operation expression. | 33 * Construct the array operation expression. |
45 */ | 34 */ |
46 | 35 |
47 Expression *BinExp::arrayOp(Scope *sc) | 36 Expression *BinExp::arrayOp(Scope *sc) |
48 { | 37 { |
49 // FIXME | |
50 error("array operations not yet implemented"); | |
51 fatal(); | |
52 | |
53 Expressions *arguments = new Expressions(); | 38 Expressions *arguments = new Expressions(); |
54 | 39 |
55 /* The expression to generate an array operation for is mangled | 40 /* The expression to generate an array operation for is mangled |
56 * into a name to use as the array operation function name. | 41 * into a name to use as the array operation function name. |
57 * Mangle in the operands and operators in RPN order, and type. | 42 * Mangle in the operands and operators in RPN order, and type. |
73 buf.writeByte(0); | 58 buf.writeByte(0); |
74 char *name = (char *)buf.extractData(); | 59 char *name = (char *)buf.extractData(); |
75 | 60 |
76 /* Look up name in hash table | 61 /* Look up name in hash table |
77 */ | 62 */ |
78 StringValue *sv = arrayfuncs.update(name, namelen); | 63 StringValue *sv = sc->module->arrayfuncs.update(name, namelen); |
79 FuncDeclaration *fd = (FuncDeclaration *)sv->ptrvalue; | 64 FuncDeclaration *fd = (FuncDeclaration *)sv->ptrvalue; |
80 if (!fd) | 65 if (!fd) |
81 { | 66 { |
82 /* Some of the array op functions are written as library functions, | 67 // /* Some of the array op functions are written as library functions, |
83 * presumably to optimize them with special CPU vector instructions. | 68 // * presumably to optimize them with special CPU vector instructions. |
84 * List those library functions here, in alpha order. | 69 // * List those library functions here, in alpha order. |
85 */ | 70 // */ |
86 static const char *libArrayopFuncs[] = | 71 // static const char *libArrayopFuncs[] = |
87 { | 72 // { |
88 "_arrayExpSliceAddass_a", | 73 // "_arrayExpSliceAddass_a", |
89 "_arrayExpSliceAddass_d", // T[]+=T | 74 // "_arrayExpSliceAddass_d", // T[]+=T |
90 "_arrayExpSliceAddass_f", // T[]+=T | 75 // "_arrayExpSliceAddass_f", // T[]+=T |
91 "_arrayExpSliceAddass_g", | 76 // "_arrayExpSliceAddass_g", |
92 "_arrayExpSliceAddass_h", | 77 // "_arrayExpSliceAddass_h", |
93 "_arrayExpSliceAddass_i", | 78 // "_arrayExpSliceAddass_i", |
94 "_arrayExpSliceAddass_k", | 79 // "_arrayExpSliceAddass_k", |
95 "_arrayExpSliceAddass_s", | 80 // "_arrayExpSliceAddass_s", |
96 "_arrayExpSliceAddass_t", | 81 // "_arrayExpSliceAddass_t", |
97 "_arrayExpSliceAddass_u", | 82 // "_arrayExpSliceAddass_u", |
98 "_arrayExpSliceAddass_w", | 83 // "_arrayExpSliceAddass_w", |
99 | 84 // |
100 "_arrayExpSliceDivass_d", // T[]/=T | 85 // "_arrayExpSliceDivass_d", // T[]/=T |
101 "_arrayExpSliceDivass_f", // T[]/=T | 86 // "_arrayExpSliceDivass_f", // T[]/=T |
102 | 87 // |
103 "_arrayExpSliceMinSliceAssign_a", | 88 // "_arrayExpSliceMinSliceAssign_a", |
104 "_arrayExpSliceMinSliceAssign_d", // T[]=T-T[] | 89 // "_arrayExpSliceMinSliceAssign_d", // T[]=T-T[] |
105 "_arrayExpSliceMinSliceAssign_f", // T[]=T-T[] | 90 // "_arrayExpSliceMinSliceAssign_f", // T[]=T-T[] |
106 "_arrayExpSliceMinSliceAssign_g", | 91 // "_arrayExpSliceMinSliceAssign_g", |
107 "_arrayExpSliceMinSliceAssign_h", | 92 // "_arrayExpSliceMinSliceAssign_h", |
108 "_arrayExpSliceMinSliceAssign_i", | 93 // "_arrayExpSliceMinSliceAssign_i", |
109 "_arrayExpSliceMinSliceAssign_k", | 94 // "_arrayExpSliceMinSliceAssign_k", |
110 "_arrayExpSliceMinSliceAssign_s", | 95 // "_arrayExpSliceMinSliceAssign_s", |
111 "_arrayExpSliceMinSliceAssign_t", | 96 // "_arrayExpSliceMinSliceAssign_t", |
112 "_arrayExpSliceMinSliceAssign_u", | 97 // "_arrayExpSliceMinSliceAssign_u", |
113 "_arrayExpSliceMinSliceAssign_w", | 98 // "_arrayExpSliceMinSliceAssign_w", |
114 | 99 // |
115 "_arrayExpSliceMinass_a", | 100 // "_arrayExpSliceMinass_a", |
116 "_arrayExpSliceMinass_d", // T[]-=T | 101 // "_arrayExpSliceMinass_d", // T[]-=T |
117 "_arrayExpSliceMinass_f", // T[]-=T | 102 // "_arrayExpSliceMinass_f", // T[]-=T |
118 "_arrayExpSliceMinass_g", | 103 // "_arrayExpSliceMinass_g", |
119 "_arrayExpSliceMinass_h", | 104 // "_arrayExpSliceMinass_h", |
120 "_arrayExpSliceMinass_i", | 105 // "_arrayExpSliceMinass_i", |
121 "_arrayExpSliceMinass_k", | 106 // "_arrayExpSliceMinass_k", |
122 "_arrayExpSliceMinass_s", | 107 // "_arrayExpSliceMinass_s", |
123 "_arrayExpSliceMinass_t", | 108 // "_arrayExpSliceMinass_t", |
124 "_arrayExpSliceMinass_u", | 109 // "_arrayExpSliceMinass_u", |
125 "_arrayExpSliceMinass_w", | 110 // "_arrayExpSliceMinass_w", |
126 | 111 // |
127 "_arrayExpSliceMulass_d", // T[]*=T | 112 // "_arrayExpSliceMulass_d", // T[]*=T |
128 "_arrayExpSliceMulass_f", // T[]*=T | 113 // "_arrayExpSliceMulass_f", // T[]*=T |
129 "_arrayExpSliceMulass_i", | 114 // "_arrayExpSliceMulass_i", |
130 "_arrayExpSliceMulass_k", | 115 // "_arrayExpSliceMulass_k", |
131 "_arrayExpSliceMulass_s", | 116 // "_arrayExpSliceMulass_s", |
132 "_arrayExpSliceMulass_t", | 117 // "_arrayExpSliceMulass_t", |
133 "_arrayExpSliceMulass_u", | 118 // "_arrayExpSliceMulass_u", |
134 "_arrayExpSliceMulass_w", | 119 // "_arrayExpSliceMulass_w", |
135 | 120 // |
136 "_arraySliceExpAddSliceAssign_a", | 121 // "_arraySliceExpAddSliceAssign_a", |
137 "_arraySliceExpAddSliceAssign_d", // T[]=T[]+T | 122 // "_arraySliceExpAddSliceAssign_d", // T[]=T[]+T |
138 "_arraySliceExpAddSliceAssign_f", // T[]=T[]+T | 123 // "_arraySliceExpAddSliceAssign_f", // T[]=T[]+T |
139 "_arraySliceExpAddSliceAssign_g", | 124 // "_arraySliceExpAddSliceAssign_g", |
140 "_arraySliceExpAddSliceAssign_h", | 125 // "_arraySliceExpAddSliceAssign_h", |
141 "_arraySliceExpAddSliceAssign_i", | 126 // "_arraySliceExpAddSliceAssign_i", |
142 "_arraySliceExpAddSliceAssign_k", | 127 // "_arraySliceExpAddSliceAssign_k", |
143 "_arraySliceExpAddSliceAssign_s", | 128 // "_arraySliceExpAddSliceAssign_s", |
144 "_arraySliceExpAddSliceAssign_t", | 129 // "_arraySliceExpAddSliceAssign_t", |
145 "_arraySliceExpAddSliceAssign_u", | 130 // "_arraySliceExpAddSliceAssign_u", |
146 "_arraySliceExpAddSliceAssign_w", | 131 // "_arraySliceExpAddSliceAssign_w", |
147 | 132 // |
148 "_arraySliceExpDivSliceAssign_d", // T[]=T[]/T | 133 // "_arraySliceExpDivSliceAssign_d", // T[]=T[]/T |
149 "_arraySliceExpDivSliceAssign_f", // T[]=T[]/T | 134 // "_arraySliceExpDivSliceAssign_f", // T[]=T[]/T |
150 | 135 // |
151 "_arraySliceExpMinSliceAssign_a", | 136 // "_arraySliceExpMinSliceAssign_a", |
152 "_arraySliceExpMinSliceAssign_d", // T[]=T[]-T | 137 // "_arraySliceExpMinSliceAssign_d", // T[]=T[]-T |
153 "_arraySliceExpMinSliceAssign_f", // T[]=T[]-T | 138 // "_arraySliceExpMinSliceAssign_f", // T[]=T[]-T |
154 "_arraySliceExpMinSliceAssign_g", | 139 // "_arraySliceExpMinSliceAssign_g", |
155 "_arraySliceExpMinSliceAssign_h", | 140 // "_arraySliceExpMinSliceAssign_h", |
156 "_arraySliceExpMinSliceAssign_i", | 141 // "_arraySliceExpMinSliceAssign_i", |
157 "_arraySliceExpMinSliceAssign_k", | 142 // "_arraySliceExpMinSliceAssign_k", |
158 "_arraySliceExpMinSliceAssign_s", | 143 // "_arraySliceExpMinSliceAssign_s", |
159 "_arraySliceExpMinSliceAssign_t", | 144 // "_arraySliceExpMinSliceAssign_t", |
160 "_arraySliceExpMinSliceAssign_u", | 145 // "_arraySliceExpMinSliceAssign_u", |
161 "_arraySliceExpMinSliceAssign_w", | 146 // "_arraySliceExpMinSliceAssign_w", |
162 | 147 // |
163 "_arraySliceExpMulSliceAddass_d", // T[] += T[]*T | 148 // "_arraySliceExpMulSliceAddass_d", // T[] += T[]*T |
164 "_arraySliceExpMulSliceAddass_f", | 149 // "_arraySliceExpMulSliceAddass_f", |
165 "_arraySliceExpMulSliceAddass_r", | 150 // "_arraySliceExpMulSliceAddass_r", |
166 | 151 // |
167 "_arraySliceExpMulSliceAssign_d", // T[]=T[]*T | 152 // "_arraySliceExpMulSliceAssign_d", // T[]=T[]*T |
168 "_arraySliceExpMulSliceAssign_f", // T[]=T[]*T | 153 // "_arraySliceExpMulSliceAssign_f", // T[]=T[]*T |
169 "_arraySliceExpMulSliceAssign_i", | 154 // "_arraySliceExpMulSliceAssign_i", |
170 "_arraySliceExpMulSliceAssign_k", | 155 // "_arraySliceExpMulSliceAssign_k", |
171 "_arraySliceExpMulSliceAssign_s", | 156 // "_arraySliceExpMulSliceAssign_s", |
172 "_arraySliceExpMulSliceAssign_t", | 157 // "_arraySliceExpMulSliceAssign_t", |
173 "_arraySliceExpMulSliceAssign_u", | 158 // "_arraySliceExpMulSliceAssign_u", |
174 "_arraySliceExpMulSliceAssign_w", | 159 // "_arraySliceExpMulSliceAssign_w", |
175 | 160 // |
176 "_arraySliceExpMulSliceMinass_d", // T[] -= T[]*T | 161 // "_arraySliceExpMulSliceMinass_d", // T[] -= T[]*T |
177 "_arraySliceExpMulSliceMinass_f", | 162 // "_arraySliceExpMulSliceMinass_f", |
178 "_arraySliceExpMulSliceMinass_r", | 163 // "_arraySliceExpMulSliceMinass_r", |
179 | 164 // |
180 "_arraySliceSliceAddSliceAssign_a", | 165 // "_arraySliceSliceAddSliceAssign_a", |
181 "_arraySliceSliceAddSliceAssign_d", // T[]=T[]+T[] | 166 // "_arraySliceSliceAddSliceAssign_d", // T[]=T[]+T[] |
182 "_arraySliceSliceAddSliceAssign_f", // T[]=T[]+T[] | 167 // "_arraySliceSliceAddSliceAssign_f", // T[]=T[]+T[] |
183 "_arraySliceSliceAddSliceAssign_g", | 168 // "_arraySliceSliceAddSliceAssign_g", |
184 "_arraySliceSliceAddSliceAssign_h", | 169 // "_arraySliceSliceAddSliceAssign_h", |
185 "_arraySliceSliceAddSliceAssign_i", | 170 // "_arraySliceSliceAddSliceAssign_i", |
186 "_arraySliceSliceAddSliceAssign_k", | 171 // "_arraySliceSliceAddSliceAssign_k", |
187 "_arraySliceSliceAddSliceAssign_r", // T[]=T[]+T[] | 172 // "_arraySliceSliceAddSliceAssign_r", // T[]=T[]+T[] |
188 "_arraySliceSliceAddSliceAssign_s", | 173 // "_arraySliceSliceAddSliceAssign_s", |
189 "_arraySliceSliceAddSliceAssign_t", | 174 // "_arraySliceSliceAddSliceAssign_t", |
190 "_arraySliceSliceAddSliceAssign_u", | 175 // "_arraySliceSliceAddSliceAssign_u", |
191 "_arraySliceSliceAddSliceAssign_w", | 176 // "_arraySliceSliceAddSliceAssign_w", |
192 | 177 // |
193 "_arraySliceSliceAddass_a", | 178 // "_arraySliceSliceAddass_a", |
194 "_arraySliceSliceAddass_d", // T[]+=T[] | 179 // "_arraySliceSliceAddass_d", // T[]+=T[] |
195 "_arraySliceSliceAddass_f", // T[]+=T[] | 180 // "_arraySliceSliceAddass_f", // T[]+=T[] |
196 "_arraySliceSliceAddass_g", | 181 // "_arraySliceSliceAddass_g", |
197 "_arraySliceSliceAddass_h", | 182 // "_arraySliceSliceAddass_h", |
198 "_arraySliceSliceAddass_i", | 183 // "_arraySliceSliceAddass_i", |
199 "_arraySliceSliceAddass_k", | 184 // "_arraySliceSliceAddass_k", |
200 "_arraySliceSliceAddass_s", | 185 // "_arraySliceSliceAddass_s", |
201 "_arraySliceSliceAddass_t", | 186 // "_arraySliceSliceAddass_t", |
202 "_arraySliceSliceAddass_u", | 187 // "_arraySliceSliceAddass_u", |
203 "_arraySliceSliceAddass_w", | 188 // "_arraySliceSliceAddass_w", |
204 | 189 // |
205 "_arraySliceSliceMinSliceAssign_a", | 190 // "_arraySliceSliceMinSliceAssign_a", |
206 "_arraySliceSliceMinSliceAssign_d", // T[]=T[]-T[] | 191 // "_arraySliceSliceMinSliceAssign_d", // T[]=T[]-T[] |
207 "_arraySliceSliceMinSliceAssign_f", // T[]=T[]-T[] | 192 // "_arraySliceSliceMinSliceAssign_f", // T[]=T[]-T[] |
208 "_arraySliceSliceMinSliceAssign_g", | 193 // "_arraySliceSliceMinSliceAssign_g", |
209 "_arraySliceSliceMinSliceAssign_h", | 194 // "_arraySliceSliceMinSliceAssign_h", |
210 "_arraySliceSliceMinSliceAssign_i", | 195 // "_arraySliceSliceMinSliceAssign_i", |
211 "_arraySliceSliceMinSliceAssign_k", | 196 // "_arraySliceSliceMinSliceAssign_k", |
212 "_arraySliceSliceMinSliceAssign_r", // T[]=T[]-T[] | 197 // "_arraySliceSliceMinSliceAssign_r", // T[]=T[]-T[] |
213 "_arraySliceSliceMinSliceAssign_s", | 198 // "_arraySliceSliceMinSliceAssign_s", |
214 "_arraySliceSliceMinSliceAssign_t", | 199 // "_arraySliceSliceMinSliceAssign_t", |
215 "_arraySliceSliceMinSliceAssign_u", | 200 // "_arraySliceSliceMinSliceAssign_u", |
216 "_arraySliceSliceMinSliceAssign_w", | 201 // "_arraySliceSliceMinSliceAssign_w", |
217 | 202 // |
218 "_arraySliceSliceMinass_a", | 203 // "_arraySliceSliceMinass_a", |
219 "_arraySliceSliceMinass_d", // T[]-=T[] | 204 // "_arraySliceSliceMinass_d", // T[]-=T[] |
220 "_arraySliceSliceMinass_f", // T[]-=T[] | 205 // "_arraySliceSliceMinass_f", // T[]-=T[] |
221 "_arraySliceSliceMinass_g", | 206 // "_arraySliceSliceMinass_g", |
222 "_arraySliceSliceMinass_h", | 207 // "_arraySliceSliceMinass_h", |
223 "_arraySliceSliceMinass_i", | 208 // "_arraySliceSliceMinass_i", |
224 "_arraySliceSliceMinass_k", | 209 // "_arraySliceSliceMinass_k", |
225 "_arraySliceSliceMinass_s", | 210 // "_arraySliceSliceMinass_s", |
226 "_arraySliceSliceMinass_t", | 211 // "_arraySliceSliceMinass_t", |
227 "_arraySliceSliceMinass_u", | 212 // "_arraySliceSliceMinass_u", |
228 "_arraySliceSliceMinass_w", | 213 // "_arraySliceSliceMinass_w", |
229 | 214 // |
230 "_arraySliceSliceMulSliceAssign_d", // T[]=T[]*T[] | 215 // "_arraySliceSliceMulSliceAssign_d", // T[]=T[]*T[] |
231 "_arraySliceSliceMulSliceAssign_f", // T[]=T[]*T[] | 216 // "_arraySliceSliceMulSliceAssign_f", // T[]=T[]*T[] |
232 "_arraySliceSliceMulSliceAssign_i", | 217 // "_arraySliceSliceMulSliceAssign_i", |
233 "_arraySliceSliceMulSliceAssign_k", | 218 // "_arraySliceSliceMulSliceAssign_k", |
234 "_arraySliceSliceMulSliceAssign_s", | 219 // "_arraySliceSliceMulSliceAssign_s", |
235 "_arraySliceSliceMulSliceAssign_t", | 220 // "_arraySliceSliceMulSliceAssign_t", |
236 "_arraySliceSliceMulSliceAssign_u", | 221 // "_arraySliceSliceMulSliceAssign_u", |
237 "_arraySliceSliceMulSliceAssign_w", | 222 // "_arraySliceSliceMulSliceAssign_w", |
238 | 223 // |
239 "_arraySliceSliceMulass_d", // T[]*=T[] | 224 // "_arraySliceSliceMulass_d", // T[]*=T[] |
240 "_arraySliceSliceMulass_f", // T[]*=T[] | 225 // "_arraySliceSliceMulass_f", // T[]*=T[] |
241 "_arraySliceSliceMulass_i", | 226 // "_arraySliceSliceMulass_i", |
242 "_arraySliceSliceMulass_k", | 227 // "_arraySliceSliceMulass_k", |
243 "_arraySliceSliceMulass_s", | 228 // "_arraySliceSliceMulass_s", |
244 "_arraySliceSliceMulass_t", | 229 // "_arraySliceSliceMulass_t", |
245 "_arraySliceSliceMulass_u", | 230 // "_arraySliceSliceMulass_u", |
246 "_arraySliceSliceMulass_w", | 231 // "_arraySliceSliceMulass_w", |
247 }; | 232 // }; |
248 | 233 // |
249 int i = binary(name, libArrayopFuncs, sizeof(libArrayopFuncs) / sizeof(char *)); | 234 // int i = binary(name, libArrayopFuncs, sizeof(libArrayopFuncs) / sizeof(char *)); |
250 if (i == -1) | 235 // if (i == -1) |
251 { | 236 // { |
252 #ifdef DEBUG // Make sure our array is alphabetized | 237 // #ifdef DEBUG // Make sure our array is alphabetized |
253 for (i = 0; i < sizeof(libArrayopFuncs) / sizeof(char *); i++) | 238 // for (i = 0; i < sizeof(libArrayopFuncs) / sizeof(char *); i++) |
254 { | 239 // { |
255 if (strcmp(name, libArrayopFuncs[i]) == 0) | 240 // if (strcmp(name, libArrayopFuncs[i]) == 0) |
256 assert(0); | 241 // assert(0); |
257 } | 242 // } |
243 // #endif | |
244 | |
245 /* Not in library, so generate it. | |
246 * Construct the function body: | |
247 * foreach (i; 0 .. p.length) for (size_t i = 0; i < p.length; i++) | |
248 * loopbody; | |
249 * return p; | |
250 */ | |
251 | |
252 Arguments *fparams = new Arguments(); | |
253 Expression *loopbody = buildArrayLoop(fparams); | |
254 Argument *p = (Argument *)fparams->data[0 /*fparams->dim - 1*/]; | |
255 #if DMDV1 | |
256 // for (size_t i = 0; i < p.length; i++) | |
257 Initializer *init = new ExpInitializer(0, new IntegerExp(0, 0, Type::tsize_t)); | |
258 Dsymbol *d = new VarDeclaration(0, Type::tsize_t, Id::p, init); | |
259 Statement *s1 = new ForStatement(0, | |
260 new DeclarationStatement(0, d), | |
261 new CmpExp(TOKlt, 0, new IdentifierExp(0, Id::p), new ArrayLengthExp(0, new IdentifierExp(0, p->ident))), | |
262 new PostExp(TOKplusplus, 0, new IdentifierExp(0, Id::p)), | |
263 new ExpStatement(0, loopbody)); | |
264 #else | |
265 // foreach (i; 0 .. p.length) | |
266 Statement *s1 = new ForeachRangeStatement(0, TOKforeach, | |
267 new Argument(0, NULL, Id::p, NULL), | |
268 new IntegerExp(0, 0, Type::tint32), | |
269 new ArrayLengthExp(0, new IdentifierExp(0, p->ident)), | |
270 new ExpStatement(0, loopbody)); | |
258 #endif | 271 #endif |
259 /* Not in library, so generate it. | 272 Statement *s2 = new ReturnStatement(0, new IdentifierExp(0, p->ident)); |
260 * Construct the function body: | 273 //printf("s2: %s\n", s2->toChars()); |
261 * foreach (i; 0 .. p.length) for (size_t i = 0; i < p.length; i++) | 274 Statement *fbody = new CompoundStatement(0, s1, s2); |
262 * loopbody; | 275 |
263 * return p; | 276 /* Construct the function |
264 */ | 277 */ |
265 | 278 TypeFunction *ftype = new TypeFunction(fparams, type, 0, LINKc); |
266 Arguments *fparams = new Arguments(); | 279 //printf("ftype: %s\n", ftype->toChars()); |
267 Expression *loopbody = buildArrayLoop(fparams); | 280 fd = new FuncDeclaration(0, 0, Lexer::idPool(name), STCundefined, ftype); |
268 Argument *p = (Argument *)fparams->data[0 /*fparams->dim - 1*/]; | 281 fd->fbody = fbody; |
269 #if DMDV1 | 282 fd->protection = PROTprotected; |
270 // for (size_t i = 0; i < p.length; i++) | 283 fd->linkage = LINKd; |
271 Initializer *init = new ExpInitializer(0, new IntegerExp(0, 0, Type::tsize_t)); | 284 |
272 Dsymbol *d = new VarDeclaration(0, Type::tsize_t, Id::p, init); | 285 // special attention for array ops |
273 Statement *s1 = new ForStatement(0, | 286 fd->isArrayOp = true; |
274 new DeclarationStatement(0, d), | 287 |
275 new CmpExp(TOKlt, 0, new IdentifierExp(0, Id::p), new ArrayLengthExp(0, new IdentifierExp(0, p->ident))), | 288 sc->module->members->push(fd); |
276 new PostExp(TOKplusplus, 0, new IdentifierExp(0, Id::p)), | 289 |
277 new ExpStatement(0, loopbody)); | 290 sc = sc->push(); |
278 #else | 291 sc->parent = sc->module; |
279 // foreach (i; 0 .. p.length) | 292 sc->stc = 0; |
280 Statement *s1 = new ForeachRangeStatement(0, TOKforeach, | 293 sc->linkage = LINKd; |
281 new Argument(0, NULL, Id::p, NULL), | 294 fd->semantic(sc); |
282 new IntegerExp(0, 0, Type::tint32), | 295 sc->pop(); |
283 new ArrayLengthExp(0, new IdentifierExp(0, p->ident)), | 296 // } |
284 new ExpStatement(0, loopbody)); | 297 // else |
285 #endif | 298 // { /* In library, refer to it. |
286 Statement *s2 = new ReturnStatement(0, new IdentifierExp(0, p->ident)); | 299 // */ |
287 //printf("s2: %s\n", s2->toChars()); | 300 // // FIXME |
288 Statement *fbody = new CompoundStatement(0, s1, s2); | 301 // fd = FuncDeclaration::genCfunc(NULL, type, name); |
289 | 302 // } |
290 /* Construct the function | 303 sv->ptrvalue = fd; // cache symbol in hash table |
291 */ | |
292 TypeFunction *ftype = new TypeFunction(fparams, type, 0, LINKc); | |
293 //printf("ftype: %s\n", ftype->toChars()); | |
294 fd = new FuncDeclaration(0, 0, Lexer::idPool(name), STCundefined, ftype); | |
295 fd->fbody = fbody; | |
296 fd->protection = PROTpublic; | |
297 fd->linkage = LINKc; | |
298 | |
299 sc->module->importedFrom->members->push(fd); | |
300 | |
301 sc = sc->push(); | |
302 sc->parent = sc->module->importedFrom; | |
303 sc->stc = 0; | |
304 sc->linkage = LINKc; | |
305 fd->semantic(sc); | |
306 sc->pop(); | |
307 } | |
308 else | |
309 { /* In library, refer to it. | |
310 */ | |
311 // LDC FIXME | |
312 fd = FuncDeclaration::genCfunc(NULL, type, name); | |
313 } | |
314 sv->ptrvalue = fd; // cache symbol in hash table | |
315 } | 304 } |
316 | 305 |
317 /* Call the function fd(arguments) | 306 /* Call the function fd(arguments) |
318 */ | 307 */ |
319 Expression *ec = new VarExp(0, fd); | 308 Expression *ec = new VarExp(0, fd); |