 |
Changeset 2649
- Timestamp:
- 10/13/07 11:41:43
(1 year ago)
- Author:
- sean
- Message:
Fix for ticket #557.
-
Files:
-
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
| r2577 |
r2649 |
|
| 47 | 47 | } |
|---|
| 48 | 48 | |
|---|
| | 49 | struct BlkInfo |
|---|
| | 50 | { |
|---|
| | 51 | void* base; |
|---|
| | 52 | size_t size; |
|---|
| | 53 | uint attr; |
|---|
| | 54 | } |
|---|
| | 55 | |
|---|
| 49 | 56 | extern (C) uint gc_getAttr( void* p ); |
|---|
| 50 | 57 | extern (C) uint gc_setAttr( void* p, uint a ); |
|---|
| … | … | |
| 56 | 63 | extern (C) void gc_free( void* p ); |
|---|
| 57 | 64 | |
|---|
| 58 | | extern (C) size_t gc_sizeOf( void* p ); |
|---|
| | 65 | extern (C) void* gc_addrOf( void* p ); |
|---|
| | 66 | extern (C) size_t gc_sizeOf( void* p ); |
|---|
| | 67 | extern (C) BlkInfo gc_query( void* p ); |
|---|
| 59 | 68 | |
|---|
| 60 | 69 | extern (C) bool onCollectResource( Object o ); |
|---|
| … | … | |
| 517 | 526 | { |
|---|
| 518 | 527 | size_t size = p.length * sizeelem; |
|---|
| 519 | | size_t cap = gc_sizeOf(p.data); |
|---|
| 520 | | |
|---|
| 521 | | if (cap <= newsize) |
|---|
| | 528 | auto info = gc_query(p.data); |
|---|
| | 529 | |
|---|
| | 530 | if (info.size <= newsize) |
|---|
| 522 | 531 | { |
|---|
| 523 | | if (cap >= PAGESIZE) |
|---|
| | 532 | if (info.size >= PAGESIZE && info.base == p.data) |
|---|
| 524 | 533 | { // Try to extend in-place |
|---|
| 525 | | auto u = gc_extend(p.data, (newsize + 1) - cap, (newsize + 1) - cap); |
|---|
| | 534 | auto u = gc_extend(p.data, (newsize + 1) - info.size, (newsize + 1) - info.size); |
|---|
| 526 | 535 | if (u) |
|---|
| 527 | 536 | { |
|---|
| … | … | |
| 529 | 538 | } |
|---|
| 530 | 539 | } |
|---|
| 531 | | newdata = cast(byte *)gc_malloc(newsize + 1, !(ti.next.flags() & 1) ? BlkAttr.NO_SCAN : 0); |
|---|
| | 540 | newdata = cast(byte *)gc_malloc(newsize + 1, info.attr); |
|---|
| 532 | 541 | newdata[0 .. size] = p.data[0 .. size]; |
|---|
| 533 | 542 | } |
|---|
| … | … | |
| 617 | 626 | if (newlength > p.length) |
|---|
| 618 | 627 | { |
|---|
| 619 | | size_t cap = gc_sizeOf(p.data); |
|---|
| 620 | | |
|---|
| 621 | | if (cap <= newsize) |
|---|
| | 628 | auto info = gc_query(p.data); |
|---|
| | 629 | |
|---|
| | 630 | if (info.size <= newsize) |
|---|
| 622 | 631 | { |
|---|
| 623 | | if (cap >= PAGESIZE) |
|---|
| | 632 | if (info.size >= PAGESIZE && info.base == p.data) |
|---|
| 624 | 633 | { // Try to extend in-place |
|---|
| 625 | | auto u = gc_extend(p.data, (newsize + 1) - cap, (newsize + 1) - cap); |
|---|
| | 634 | auto u = gc_extend(p.data, (newsize + 1) - info.size, (newsize + 1) - info.size); |
|---|
| 626 | 635 | if (u) |
|---|
| 627 | 636 | { |
|---|
| … | … | |
| 629 | 638 | } |
|---|
| 630 | 639 | } |
|---|
| 631 | | newdata = cast(byte *)gc_malloc(newsize + 1, !(ti.next.flags() & 1) ? BlkAttr.NO_SCAN : 0); |
|---|
| | 640 | newdata = cast(byte *)gc_malloc(newsize + 1, info.attr); |
|---|
| 632 | 641 | newdata[0 .. size] = p.data[0 .. size]; |
|---|
| 633 | 642 | L1: ; |
|---|
| … | … | |
| 679 | 688 | { |
|---|
| 680 | 689 | auto sizeelem = ti.next.tsize(); // array element size |
|---|
| 681 | | auto cap = gc_sizeOf(px.data); |
|---|
| | 690 | auto info = gc_query(px.data); |
|---|
| 682 | 691 | auto length = px.length; |
|---|
| 683 | 692 | auto newlength = length + y.length; |
|---|
| 684 | 693 | auto newsize = newlength * sizeelem; |
|---|
| 685 | 694 | |
|---|
| 686 | | if (newsize > cap) |
|---|
| | 695 | if (info.size < newsize) |
|---|
| 687 | 696 | { byte* newdata; |
|---|
| 688 | 697 | |
|---|
| 689 | | if (cap >= PAGESIZE) |
|---|
| | 698 | if (info.size >= PAGESIZE && info.base == px.data) |
|---|
| 690 | 699 | { // Try to extend in-place |
|---|
| 691 | | auto u = gc_extend(px.data, (newsize + 1) - cap, (newsize + 1) - cap); |
|---|
| | 700 | auto u = gc_extend(px.data, (newsize + 1) - info.size, (newsize + 1) - info.size); |
|---|
| 692 | 701 | if (u) |
|---|
| 693 | 702 | { |
|---|
| … | … | |
| 695 | 704 | } |
|---|
| 696 | 705 | } |
|---|
| 697 | | newdata = cast(byte *)gc_malloc(newCapacity(newlength, sizeelem) + 1, !(ti.next.flags() & 1) ? BlkAttr.NO_SCAN : 0); |
|---|
| | 706 | newdata = cast(byte *)gc_malloc(newCapacity(newlength, sizeelem) + 1, info.attr); |
|---|
| 698 | 707 | memcpy(newdata, px.data, length * sizeelem); |
|---|
| 699 | 708 | px.data = newdata; |
|---|
| … | … | |
| 784 | 793 | { |
|---|
| 785 | 794 | auto sizeelem = ti.next.tsize(); // array element size |
|---|
| 786 | | auto cap = gc_sizeOf(x.ptr); |
|---|
| | 795 | auto info = gc_query(x.ptr); |
|---|
| 787 | 796 | auto length = x.length; |
|---|
| 788 | 797 | auto newlength = length + 1; |
|---|
| 789 | 798 | auto newsize = newlength * sizeelem; |
|---|
| 790 | 799 | |
|---|
| 791 | | assert(cap == 0 || length * sizeelem <= cap); |
|---|
| 792 | | |
|---|
| 793 | | debug(PRINTF) printf("_d_arrayappendc(sizeelem = %d, ptr = %p, length = %d, cap = %d)\n", sizeelem, x.ptr, x.length, cap); |
|---|
| 794 | | |
|---|
| 795 | | if (newsize >= cap) |
|---|
| | 800 | assert(info.size == 0 || length * sizeelem <= info.size); |
|---|
| | 801 | |
|---|
| | 802 | debug(PRINTF) printf("_d_arrayappendc(sizeelem = %d, ptr = %p, length = %d, cap = %d)\n", sizeelem, x.ptr, x.length, info.size); |
|---|
| | 803 | |
|---|
| | 804 | if (info.size <= newsize) |
|---|
| 796 | 805 | { byte* newdata; |
|---|
| 797 | 806 | |
|---|
| 798 | | if (cap >= PAGESIZE) |
|---|
| | 807 | if (info.size >= PAGESIZE && info.base == x.ptr) |
|---|
| 799 | 808 | { // Try to extend in-place |
|---|
| 800 | | auto u = gc_extend(x.ptr, (newsize + 1) - cap, (newsize + 1) - cap); |
|---|
| | 809 | auto u = gc_extend(x.ptr, (newsize + 1) - info.size, (newsize + 1) - info.size); |
|---|
| 801 | 810 | if (u) |
|---|
| 802 | 811 | { |
|---|
| … | … | |
| 804 | 813 | } |
|---|
| 805 | 814 | } |
|---|
| 806 | | debug(PRINTF) printf("_d_arrayappendc(size = %d, newlength = %d, cap = %d)\n", size, newlength, cap); |
|---|
| 807 | | cap = newCapacity(newlength, sizeelem); |
|---|
| 808 | | assert(cap >= newlength * sizeelem); |
|---|
| 809 | | newdata = cast(byte *)gc_malloc(cap + 1, !(ti.next.flags() & 1) ? BlkAttr.NO_SCAN : 0); |
|---|
| | 815 | debug(PRINTF) printf("_d_arrayappendc(size = %d, newlength = %d, cap = %d)\n", size, newlength, info.size); |
|---|
| | 816 | auto newcap = newCapacity(newlength, sizeelem); |
|---|
| | 817 | assert(newcap >= newlength * sizeelem); |
|---|
| | 818 | newdata = cast(byte *)gc_malloc(newcap + 1, info.attr); |
|---|
| 810 | 819 | memcpy(newdata, x.ptr, length * sizeelem); |
|---|
| 811 | 820 | (cast(void**)(&x))[1] = newdata; |
|---|
| r2577 |
r2649 |
|
| 47 | 47 | } |
|---|
| 48 | 48 | |
|---|
| | 49 | struct BlkInfo |
|---|
| | 50 | { |
|---|
| | 51 | void* base; |
|---|
| | 52 | size_t size; |
|---|
| | 53 | uint attr; |
|---|
| | 54 | } |
|---|
| | 55 | |
|---|
| 49 | 56 | extern (C) uint gc_getAttr( void* p ); |
|---|
| 50 | 57 | extern (C) uint gc_setAttr( void* p, uint a ); |
|---|
| … | … | |
| 56 | 63 | extern (C) void gc_free( void* p ); |
|---|
| 57 | 64 | |
|---|
| 58 | | extern (C) size_t gc_sizeOf( void* p ); |
|---|
| | 65 | extern (C) void* gc_addrOf( void* p ); |
|---|
| | 66 | extern (C) size_t gc_sizeOf( void* p ); |
|---|
| | 67 | extern (C) BlkInfo gc_query( void* p ); |
|---|
| 59 | 68 | |
|---|
| 60 | 69 | extern (C) bool onCollectResource( Object o ); |
|---|
| … | … | |
| 517 | 526 | { |
|---|
| 518 | 527 | size_t size = p.length * sizeelem; |
|---|
| 519 | | size_t cap = gc_sizeOf(p.data); |
|---|
| 520 | | |
|---|
| 521 | | if (cap <= newsize) |
|---|
| | 528 | auto info = gc_query(p.data); |
|---|
| | 529 | |
|---|
| | 530 | if (info.size <= newsize) |
|---|
| 522 | 531 | { |
|---|
| 523 | | if (cap >= PAGESIZE) |
|---|
| | 532 | if (info.size >= PAGESIZE && info.base == p.data) |
|---|
| 524 | 533 | { // Try to extend in-place |
|---|
| 525 | | auto u = gc_extend(p.data, (newsize + 1) - cap, (newsize + 1) - cap); |
|---|
| | 534 | auto u = gc_extend(p.data, (newsize + 1) - info.size, (newsize + 1) - info.size); |
|---|
| 526 | 535 | if (u) |
|---|
| 527 | 536 | { |
|---|
| … | … | |
| 529 | 538 | } |
|---|
| 530 | 539 | } |
|---|
| 531 | | newdata = cast(byte *)gc_malloc(newsize + 1, !(ti.next.flags() & 1) ? BlkAttr.NO_SCAN : 0); |
|---|
| | 540 | newdata = cast(byte *)gc_malloc(newsize + 1, info.attr); |
|---|
| 532 | 541 | newdata[0 .. size] = p.data[0 .. size]; |
|---|
| 533 | 542 | } |
|---|
| … | … | |
| 624 | 633 | if (newlength > p.length) |
|---|
| 625 | 634 | { |
|---|
| 626 | | size_t cap = gc_sizeOf(p.data); |
|---|
| 627 | | |
|---|
| 628 | | if (cap <= newsize) |
|---|
| | 635 | auto info = gc_query(p.data); |
|---|
| | 636 | |
|---|
| | 637 | if (info.size <= newsize) |
|---|
| 629 | 638 | { |
|---|
| 630 | | if (cap >= PAGESIZE) |
|---|
| | 639 | if (info.size >= PAGESIZE && info.base == p.data) |
|---|
| 631 | 640 | { // Try to extend in-place |
|---|
| 632 | | auto u = gc_extend(p.data, (newsize + 1) - cap, (newsize + 1) - cap); |
|---|
| | 641 | auto u = gc_extend(p.data, (newsize + 1) - info.size, (newsize + 1) - info.size); |
|---|
| 633 | 642 | if (u) |
|---|
| 634 | 643 | { |
|---|
| … | … | |
| 636 | 645 | } |
|---|
| 637 | 646 | } |
|---|
| 638 | | newdata = cast(byte *)gc_malloc(newsize + 1, !(ti.next.flags() & 1) ? BlkAttr.NO_SCAN : 0); |
|---|
| | 647 | newdata = cast(byte *)gc_malloc(newsize + 1, info.attr); |
|---|
| 639 | 648 | newdata[0 .. size] = p.data[0 .. size]; |
|---|
| 640 | 649 | L1: ; |
|---|
| … | … | |
| 686 | 695 | { |
|---|
| 687 | 696 | auto sizeelem = ti.next.tsize(); // array element size |
|---|
| 688 | | auto cap = gc_sizeOf(px.data); |
|---|
| | 697 | auto info = gc_query(px.data); |
|---|
| 689 | 698 | auto length = px.length; |
|---|
| 690 | 699 | auto newlength = length + y.length; |
|---|
| 691 | 700 | auto newsize = newlength * sizeelem; |
|---|
| 692 | 701 | |
|---|
| 693 | | if (newsize > cap) |
|---|
| | 702 | if (info.size < newsize) |
|---|
| 694 | 703 | { byte* newdata; |
|---|
| 695 | 704 | |
|---|
| 696 | | if (cap >= PAGESIZE) |
|---|
| | 705 | if (info.size >= PAGESIZE && info.base == px.data) |
|---|
| 697 | 706 | { // Try to extend in-place |
|---|
| 698 | | auto u = gc_extend(px.data, (newsize + 1) - cap, (newsize + 1) - cap); |
|---|
| | 707 | auto u = gc_extend(px.data, (newsize + 1) - info.size, (newsize + 1) - info.size); |
|---|
| 699 | 708 | if (u) |
|---|
| 700 | 709 | { |
|---|
| … | … | |
| 702 | 711 | } |
|---|
| 703 | 712 | } |
|---|
| 704 | | newdata = cast(byte *)gc_malloc(newCapacity(newlength, sizeelem) + 1, !(ti.next.flags() & 1) ? BlkAttr.NO_SCAN : 0); |
|---|
| | 713 | newdata = cast(byte *)gc_malloc(newCapacity(newlength, sizeelem) + 1, info.attr); |
|---|
| 705 | 714 | memcpy(newdata, px.data, length * sizeelem); |
|---|
| 706 | 715 | px.data = newdata; |
|---|
| … | … | |
| 791 | 800 | { |
|---|
| 792 | 801 | auto sizeelem = ti.next.tsize(); // array element size |
|---|
| 793 | | auto cap = gc_sizeOf(x.ptr); |
|---|
| | 802 | auto info = gc_query(x.ptr); |
|---|
| 794 | 803 | auto length = x.length; |
|---|
| 795 | 804 | auto newlength = length + 1; |
|---|
| 796 | 805 | auto newsize = newlength * sizeelem; |
|---|
| 797 | 806 | |
|---|
| 798 | | assert(cap == 0 || length * sizeelem <= cap); |
|---|
| 799 | | |
|---|
| 800 | | debug(PRINTF) printf("_d_arrayappendc(sizeelem = %d, ptr = %p, length = %d, cap = %d)\n", sizeelem, x.ptr, x.length, cap); |
|---|
| 801 | | |
|---|
| 802 | | if (newsize >= cap) |
|---|
| | 807 | assert(info.size == 0 || length * sizeelem <= info.size); |
|---|
| | 808 | |
|---|
| | 809 | debug(PRINTF) printf("_d_arrayappendc(sizeelem = %d, ptr = %p, length = %d, cap = %d)\n", sizeelem, x.ptr, x.length, info.size); |
|---|
| | 810 | |
|---|
| | 811 | if (info.size <= newsize) |
|---|
| 803 | 812 | { byte* newdata; |
|---|
| 804 | 813 | |
|---|
| 805 | | if (cap >= PAGESIZE) |
|---|
| | 814 | if (info.size >= PAGESIZE && info.base == x.ptr) |
|---|
| 806 | 815 | { // Try to extend in-place |
|---|
| 807 | | auto u = gc_extend(x.ptr, (newsize + 1) - cap, (newsize + 1) - cap); |
|---|
| | 816 | auto u = gc_extend(x.ptr, (newsize + 1) - info.size, (newsize + 1) - info.size); |
|---|
| 808 | 817 | if (u) |
|---|
| 809 | 818 | { |
|---|
| … | … | |
| 811 | 820 | } |
|---|
| 812 | 821 | } |
|---|
| 813 | | debug(PRINTF) printf("_d_arrayappendc(size = %d, newlength = %d, cap = %d)\n", size, newlength, cap); |
|---|
| 814 | | cap = newCapacity(newlength, sizeelem); |
|---|
| 815 | | assert(cap >= newlength * sizeelem); |
|---|
| 816 | | newdata = cast(byte *)gc_malloc(cap + 1, !(ti.next.flags() & 1) ? BlkAttr.NO_SCAN : 0); |
|---|
| | 822 | debug(PRINTF) printf("_d_arrayappendc(size = %d, newlength = %d, cap = %d)\n", size, newlength, info.size); |
|---|
| | 823 | auto newcap = newCapacity(newlength, sizeelem); |
|---|
| | 824 | assert(newcap >= newlength * sizeelem); |
|---|
| | 825 | newdata = cast(byte *)gc_malloc(newcap + 1, info.attr); |
|---|
| 817 | 826 | memcpy(newdata, x.ptr, length * sizeelem); |
|---|
| 818 | 827 | (cast(void**)(&x))[1] = newdata; |
|---|
| r2648 |
r2649 |
|
| 132 | 132 | extern (C) BlkInfo gc_query( void* p ) |
|---|
| 133 | 133 | { |
|---|
| 134 | | return BlkInfo.init |
|---|
| | 134 | return BlkInfo.init; |
|---|
| 135 | 135 | } |
|---|
| 136 | 136 | |
|---|
Download in other formats:
|
 |