comparison tango/lib/compiler/llvmdc/lifetime.d @ 211:f66219e0d530 trunk

[svn r227] Fixed: crash in lifetime.d when resizing array of AAs by .length assignment.
author lindquist
date Tue, 27 May 2008 19:53:29 +0200
parents c4c9b4ac021b
children 4c2689d57ba4
comparison
equal deleted inserted replaced
210:1d6cfdbc97f0 211:f66219e0d530
512 byte* newdata; 512 byte* newdata;
513 size_t sizeelem = ti.next.tsize(); 513 size_t sizeelem = ti.next.tsize();
514 514
515 debug(PRINTF) 515 debug(PRINTF)
516 { 516 {
517 printf("_d_arraysetlengthT(p = %p, sizeelem = %d, newlength = %d)\n", p, sizeelem, newlength); 517 printf("_d_arraysetlengthT(sizeelem = %d, newlength = %d)\n", sizeelem, newlength);
518 if (p) 518 printf("\tp.data = %p, p.length = %d\n", pdata, plength);
519 printf("\tp.data = %p, p.length = %d\n", pdata, plength);
520 } 519 }
521 520
522 if (newlength) 521 if (newlength)
523 { 522 {
524 version (D_InlineAsm_X86) 523 version (D_InlineAsm_X86)
600 assert(!plength || pdata); 599 assert(!plength || pdata);
601 } 600 }
602 body 601 body
603 { 602 {
604 byte* newdata; 603 byte* newdata;
605 size_t sizeelem = ti.next.tsize(); 604 TypeInfo tinext = ti.next;
606 void[] initializer = ti.next.init(); 605 size_t sizeelem = tinext.tsize();
606 void[] initializer = tinext.init();
607 size_t initsize = initializer.length; 607 size_t initsize = initializer.length;
608 608
609 assert(sizeelem); 609 assert(sizeelem);
610 assert(initsize); 610 assert(initsize);
611 assert(initsize <= sizeelem); 611 assert(initsize <= sizeelem);
612 assert((sizeelem / initsize) * initsize == sizeelem); 612 assert((sizeelem / initsize) * initsize == sizeelem);
613 613
614 debug(PRINTF) 614 debug(PRINTF)
615 { 615 {
616 printf("_d_arraysetlengthiT(p = %p, sizeelem = %d, newlength = %d, initsize = %d)\n", p, sizeelem, newlength, initsize); 616 printf("_d_arraysetlengthiT(sizeelem = %d, newlength = %d, initsize = %d)\n", sizeelem, newlength, initsize);
617 if (p) 617 printf("\tp.data = %p, p.length = %d\n", pdata, plength);
618 printf("\tp.data = %p, p.length = %d\n", pdata, plength);
619 } 618 }
620 619
621 if (newlength) 620 if (newlength)
622 { 621 {
623 version (D_InlineAsm_X86) 622 version (D_InlineAsm_X86)
666 } 665 }
667 } 666 }
668 } 667 }
669 else 668 else
670 { 669 {
671 newdata = cast(byte *)gc_malloc(newsize + 1, !(ti.next.flags() & 1) ? BlkAttr.NO_SCAN : 0); 670 newdata = cast(byte *)gc_malloc(newsize + 1, !(tinext.flags() & 1) ? BlkAttr.NO_SCAN : 0);
672 } 671 }
673 672
674 auto q = initializer.ptr; // pointer to initializer 673 auto q = initializer.ptr; // pointer to initializer
675 674
676 if (newsize > size) 675 if (newsize > size)