Download Reference Manual
The Developer's Library for D
About Wiki Forums Source Search Contact

Ticket #981: tango.patch

File tango.patch, 3.2 kB (added by CyberShadow, 16 years ago)

Proposed patch (v2)

  • lifetime.d

    old new  
    538538            if (newlength > p.length) 
    539539            { 
    540540                size_t size = p.length * sizeelem; 
     541                if (size >= PAGESIZE && ((newsize-1)&~(PAGESIZE-1)) == ((size-1)&~(PAGESIZE-1))) 
     542                    goto L1; 
    541543                auto   info = gc_query(p.data); 
    542544 
    543545                if (info.size <= newsize || info.base != p.data) 
     
    638640            newdata = p.data; 
    639641            if (newlength > p.length) 
    640642            { 
     643                if (size >= PAGESIZE && ((newsize-1)&~(PAGESIZE-1)) == ((size-1)&~(PAGESIZE-1))) 
     644                    goto L1; 
     645                 
    641646                auto info = gc_query(p.data); 
    642647 
    643648                if (info.size <= newsize || info.base != p.data) 
     
    700705extern (C) long _d_arrayappendT(TypeInfo ti, Array *px, byte[] y) 
    701706{ 
    702707    auto sizeelem = ti.next.tsize();            // array element size 
    703     auto info = gc_query(px.data); 
    704708    auto length = px.length; 
    705709    auto newlength = length + y.length; 
    706710    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); 
    707715 
    708716    if (info.size < newsize || info.base != px.data) 
    709717    {   byte* newdata; 
     
    717725            } 
    718726        } 
    719727        newdata = cast(byte *)gc_malloc(newCapacity(newlength, sizeelem) + 1, info.attr); 
    720         memcpy(newdata, px.data, length * sizeelem); 
     728        memcpy(newdata, px.data, size); 
    721729        px.data = newdata; 
    722730    } 
    723731  L1: 
    724732    px.length = newlength; 
    725     memcpy(px.data + length * sizeelem, y.ptr, y.length * sizeelem); 
     733    memcpy(px.data + size, y.ptr, y.length * sizeelem); 
    726734    return *cast(long*)px; 
    727735} 
    728736 
     
    805813extern (C) byte[] _d_arrayappendcT(TypeInfo ti, inout byte[] x, ...) 
    806814{ 
    807815    auto sizeelem = ti.next.tsize();            // array element size 
    808     auto info = gc_query(x.ptr); 
    809816    auto length = x.length; 
    810817    auto newlength = length + 1; 
    811818    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); 
    812823 
    813     assert(info.size == 0 || length * sizeelem <= info.size); 
     824    assert(info.size == 0 || size <= info.size); 
    814825 
    815826    debug(PRINTF) printf("_d_arrayappendcT(sizeelem = %d, ptr = %p, length = %d, cap = %d)\n", sizeelem, x.ptr, x.length, info.size); 
    816827 
     
    829840        auto newcap = newCapacity(newlength, sizeelem); 
    830841        assert(newcap >= newlength * sizeelem); 
    831842        newdata = cast(byte *)gc_malloc(newcap + 1, info.attr); 
    832         memcpy(newdata, x.ptr, length * sizeelem); 
     843        memcpy(newdata, x.ptr, size); 
    833844        (cast(void**)(&x))[1] = newdata; 
    834845    } 
    835846  L1: 
    836847    byte *argp = cast(byte *)(&ti + 2); 
    837848 
    838849    *cast(size_t *)&x = newlength; 
    839     x.ptr[length * sizeelem .. newsize] = argp[0 .. sizeelem]; 
     850    x.ptr[size .. newsize] = argp[0 .. sizeelem]; 
    840851    assert((cast(size_t)x.ptr & 15) == 0); 
    841852    assert(gc_sizeOf(x.ptr) > x.length * sizeelem); 
    842853    return x;