Mercurial > projects > ldc
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) |