Mercurial > projects > ldc
comparison tango/lib/compiler/llvmdc/lifetime.d @ 286:a3b7c19c866c trunk
[svn r307] Fixed: multidimensional new expressions now work. Eg.:
auto ma = new int[][] (3,9);
author | lindquist |
---|---|
date | Sat, 21 Jun 2008 04:47:14 +0200 |
parents | 23d0d9855cad |
children | 2b72433d5c8c |
comparison
equal
deleted
inserted
replaced
285:297690b5d4a5 | 286:a3b7c19c866c |
---|---|
291 Loverflow: | 291 Loverflow: |
292 onOutOfMemoryError(); | 292 onOutOfMemoryError(); |
293 return null; | 293 return null; |
294 } | 294 } |
295 | 295 |
296 /+ | 296 /** |
297 | 297 * |
298 /** | 298 */ |
299 * | 299 extern (C) void* _d_newarraymT(TypeInfo ti, int ndims, size_t* dims) |
300 */ | 300 { |
301 extern (C) Array _d_newarraymT(TypeInfo ti, int ndims, ...) | 301 void* result; |
302 { | |
303 Array result; | |
304 | 302 |
305 debug(PRINTF) printf("_d_newarraymT(ndims = %d)\n", ndims); | 303 debug(PRINTF) printf("_d_newarraymT(ndims = %d)\n", ndims); |
306 if (ndims == 0) | 304 if (ndims == 0) |
307 result = Array(); | 305 result = null; |
308 else | 306 else |
309 { va_list q; | 307 { |
310 va_start!(int)(q, ndims); | 308 static void[] foo(TypeInfo ti, size_t* pdim, int ndims) |
311 | |
312 void[] foo(TypeInfo ti, size_t* pdim, int ndims) | |
313 { | 309 { |
314 size_t dim = *pdim; | 310 size_t dim = *pdim; |
315 void[] p; | 311 void[] p; |
316 | 312 |
317 debug(PRINTF) printf("foo(ti = %p, ti.next = %p, dim = %d, ndims = %d\n", ti, ti.next, dim, ndims); | 313 debug(PRINTF) printf("foo(ti = %p, ti.next = %p, dim = %d, ndims = %d\n", ti, ti.next, dim, ndims); |
318 if (ndims == 1) | 314 if (ndims == 1) |
319 { | 315 { |
320 return _d_newarrayT(ti, dim); | 316 auto r = _d_newarrayT(ti, dim); |
317 return r[0 .. dim]; | |
321 } | 318 } |
322 else | 319 else |
323 { | 320 { |
324 p = gc_malloc(dim * (void[]).sizeof + 1)[0 .. dim]; | 321 p = gc_malloc(dim * (void[]).sizeof + 1)[0 .. dim]; |
325 for (int i = 0; i < dim; i++) | 322 for (int i = 0; i < dim; i++) |
328 } | 325 } |
329 } | 326 } |
330 return p; | 327 return p; |
331 } | 328 } |
332 | 329 |
333 size_t* pdim = cast(size_t *)q; | 330 result = foo(ti, dims, ndims).ptr; |
334 void[] arr = foo(ti, pdim, ndims); | 331 debug(PRINTF) printf("result = %p\n", result); |
335 result = Arra | |
336 debug(PRINTF) printf("result = %llx\n", result); | |
337 | 332 |
338 version (none) | 333 version (none) |
339 { | 334 { |
340 for (int i = 0; i < ndims; i++) | 335 for (int i = 0; i < ndims; i++) |
341 { | 336 { |
342 printf("index %d: %d\n", i, va_arg!(int)(q)); | 337 printf("index %d: %d\n", i, *dims++); |
343 } | 338 } |
344 } | 339 } |
345 va_end(q); | |
346 } | 340 } |
347 return result; | 341 return result; |
348 } | 342 } |
349 | 343 |
350 | 344 |
351 /** | 345 /** |
352 * | 346 * |
353 */ | 347 */ |
354 extern (C) Array _d_newarraymiT(TypeInfo ti, int ndims, ...) | 348 extern (C) void* _d_newarraymiT(TypeInfo ti, int ndims, size_t* dims) |
355 { | 349 { |
356 Array result; | 350 void* result; |
357 | 351 |
358 debug(PRINTF) printf("_d_newarraymiT(ndims = %d)\n", ndims); | 352 debug(PRINTF) printf("_d_newarraymiT(ndims = %d)\n", ndims); |
359 if (ndims == 0) | 353 if (ndims == 0) |
360 result = 0; | 354 result = null; |
361 else | 355 else |
362 { | 356 { |
363 va_list q; | 357 static void[] foo(TypeInfo ti, size_t* pdim, int ndims) |
364 va_start!(int)(q, ndims); | |
365 | |
366 void[] foo(TypeInfo ti, size_t* pdim, int ndims) | |
367 { | 358 { |
368 size_t dim = *pdim; | 359 size_t dim = *pdim; |
369 void[] p; | 360 void[] p; |
370 | 361 |
371 if (ndims == 1) | 362 if (ndims == 1) |
372 { | 363 { |
373 auto r = _d_newarrayiT(ti, dim); | 364 auto r = _d_newarrayiT(ti, dim); |
374 p = *cast(void[]*)(&r); | 365 p = r[0 .. dim]; |
375 } | 366 } |
376 else | 367 else |
377 { | 368 { |
378 p = gc_malloc(dim * (void[]).sizeof + 1)[0 .. dim]; | 369 p = gc_malloc(dim * (void[]).sizeof + 1)[0 .. dim]; |
379 for (int i = 0; i < dim; i++) | 370 for (int i = 0; i < dim; i++) |
382 } | 373 } |
383 } | 374 } |
384 return p; | 375 return p; |
385 } | 376 } |
386 | 377 |
387 size_t* pdim = cast(size_t *)q; | 378 result = foo(ti, dims, ndims).ptr; |
388 result = cast(ulong)foo(ti, pdim, ndims); | 379 debug(PRINTF) printf("result = %p\n", result); |
389 debug(PRINTF) printf("result = %llx\n", result); | |
390 | 380 |
391 version (none) | 381 version (none) |
392 { | 382 { |
393 for (int i = 0; i < ndims; i++) | 383 for (int i = 0; i < ndims; i++) |
394 { | 384 { |
395 printf("index %d: %d\n", i, va_arg!(int)(q)); | 385 printf("index %d: %d\n", i, *dims++); |
396 printf("init = %d\n", va_arg!(int)(q)); | 386 printf("init = %d\n", *dims++); |
397 } | 387 } |
398 } | 388 } |
399 va_end(q); | |
400 } | 389 } |
401 return result; | 390 return result; |
402 } | 391 } |
392 | |
393 /+ | |
403 | 394 |
404 /** | 395 /** |
405 * | 396 * |
406 */ | 397 */ |
407 void* _d_allocmemory(size_t nbytes) | 398 void* _d_allocmemory(size_t nbytes) |