Ticket #981: tango.patch
File tango.patch, 3.2 kB (added by CyberShadow, 16 years ago) |
---|
Proposed patch (v2) |
-
lifetime.d
old new 538 538 if (newlength > p.length) 539 539 { 540 540 size_t size = p.length * sizeelem; 541 if (size >= PAGESIZE && ((newsize-1)&~(PAGESIZE-1)) == ((size-1)&~(PAGESIZE-1))) 542 goto L1; 541 543 auto info = gc_query(p.data); 542 544 543 545 if (info.size <= newsize || info.base != p.data) … … 638 640 newdata = p.data; 639 641 if (newlength > p.length) 640 642 { 643 if (size >= PAGESIZE && ((newsize-1)&~(PAGESIZE-1)) == ((size-1)&~(PAGESIZE-1))) 644 goto L1; 645 641 646 auto info = gc_query(p.data); 642 647 643 648 if (info.size <= newsize || info.base != p.data) … … 700 705 extern (C) long _d_arrayappendT(TypeInfo ti, Array *px, byte[] y) 701 706 { 702 707 auto sizeelem = ti.next.tsize(); // array element size 703 auto info = gc_query(px.data);704 708 auto length = px.length; 705 709 auto newlength = length + y.length; 706 710 auto newsize = newlength * sizeelem; 711 auto size = length * sizeelem; 712 if (size >= PAGESIZE && ((newsize-1)&~(PAGESIZE-1)) == ((size-1)&~(PAGESIZE-1))) 713 goto L1; 714 auto info = gc_query(px.data); 707 715 708 716 if (info.size < newsize || info.base != px.data) 709 717 { byte* newdata; … … 717 725 } 718 726 } 719 727 newdata = cast(byte *)gc_malloc(newCapacity(newlength, sizeelem) + 1, info.attr); 720 memcpy(newdata, px.data, length * sizeelem);728 memcpy(newdata, px.data, size); 721 729 px.data = newdata; 722 730 } 723 731 L1: 724 732 px.length = newlength; 725 memcpy(px.data + length * sizeelem, y.ptr, y.length * sizeelem);733 memcpy(px.data + size, y.ptr, y.length * sizeelem); 726 734 return *cast(long*)px; 727 735 } 728 736 … … 805 813 extern (C) byte[] _d_arrayappendcT(TypeInfo ti, inout byte[] x, ...) 806 814 { 807 815 auto sizeelem = ti.next.tsize(); // array element size 808 auto info = gc_query(x.ptr);809 816 auto length = x.length; 810 817 auto newlength = length + 1; 811 818 auto newsize = newlength * sizeelem; 819 auto size = length * sizeelem; 820 if (size >= PAGESIZE && ((newsize-1)&~(PAGESIZE-1)) == ((size-1)&~(PAGESIZE-1))) 821 goto L1; 822 auto info = gc_query(x.ptr); 812 823 813 assert(info.size == 0 || length * sizeelem<= info.size);824 assert(info.size == 0 || size <= info.size); 814 825 815 826 debug(PRINTF) printf("_d_arrayappendcT(sizeelem = %d, ptr = %p, length = %d, cap = %d)\n", sizeelem, x.ptr, x.length, info.size); 816 827 … … 829 840 auto newcap = newCapacity(newlength, sizeelem); 830 841 assert(newcap >= newlength * sizeelem); 831 842 newdata = cast(byte *)gc_malloc(newcap + 1, info.attr); 832 memcpy(newdata, x.ptr, length * sizeelem);843 memcpy(newdata, x.ptr, size); 833 844 (cast(void**)(&x))[1] = newdata; 834 845 } 835 846 L1: 836 847 byte *argp = cast(byte *)(&ti + 2); 837 848 838 849 *cast(size_t *)&x = newlength; 839 x.ptr[ length * sizeelem.. newsize] = argp[0 .. sizeelem];850 x.ptr[size .. newsize] = argp[0 .. sizeelem]; 840 851 assert((cast(size_t)x.ptr & 15) == 0); 841 852 assert(gc_sizeOf(x.ptr) > x.length * sizeelem); 842 853 return x;