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)