 |
Changeset 3439
- Timestamp:
- 04/17/08 01:28:00
(8 months ago)
- Author:
- sean
- Message:
Added TypeInfo? for key to associative array and fixed primitive detection of value type. It had been treating the value type as if it had pointers if value.sizeof == void.sizeof, and this is only true for pointers (ie. void arrays). An associative array would have its value type be a void array reference, not a single element of a void array itself. All of this should improve GC efficiency a bit in apps using GCs. Please let me know if there are any problems. This closes #1037
-
Files:
-
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
| r2974 |
r3439 |
|
| 88 | 88 | aaA*[] b; |
|---|
| 89 | 89 | size_t nodes; // total number of aaA nodes |
|---|
| | 90 | TypeInfo keyti; // TODO: replace this with TypeInfo_AssociativeArray when available in _aaGet() |
|---|
| 90 | 91 | } |
|---|
| 91 | 92 | |
|---|
| … | … | |
| 255 | 256 | if (!aa.a) |
|---|
| 256 | 257 | aa.a = new BB(); |
|---|
| | 258 | aa.a.keyti = keyti; |
|---|
| 257 | 259 | |
|---|
| 258 | 260 | if (!aa.a.b.length) |
|---|
| … | … | |
| 284 | 286 | //printf("create new one\n"); |
|---|
| 285 | 287 | size_t size = aaA.sizeof + keysize + valuesize; |
|---|
| 286 | | uint bits = keysize < (void*).sizeof && |
|---|
| 287 | | keysize > (void).sizeof && |
|---|
| 288 | | valuesize < (void*).sizeof && |
|---|
| 289 | | valuesize > (void).sizeof ? BlkAttr.NO_SCAN : 0; |
|---|
| | 288 | uint bits = !(aa.a.keyti.flags() & 1) && |
|---|
| | 289 | valuesize < (void*).sizeof ? BlkAttr.NO_SCAN : 0; |
|---|
| 290 | 290 | e = cast(aaA *) gc_calloc(size, bits); |
|---|
| 291 | 291 | memcpy(e + 1, pkey, keysize); |
|---|
| … | … | |
| 491 | 491 | a.length = _aaLen(aa); |
|---|
| 492 | 492 | a.ptr = cast(byte*) gc_malloc(a.length * valuesize, |
|---|
| 493 | | valuesize < (void*).sizeof && |
|---|
| 494 | | valuesize > (void).sizeof ? BlkAttr.NO_SCAN : 0); |
|---|
| | 493 | valuesize < (void*).sizeof ? BlkAttr.NO_SCAN : 0); |
|---|
| 495 | 494 | resi = 0; |
|---|
| 496 | 495 | foreach (e; aa.a.b) |
|---|
| … | … | |
| 628 | 627 | return 0; |
|---|
| 629 | 628 | res = (cast(byte*) gc_malloc(len * keysize, |
|---|
| 630 | | keysize < (void*).sizeof && |
|---|
| 631 | | keysize > (void).sizeof ? BlkAttr.NO_SCAN : 0))[0 .. len * keysize]; |
|---|
| | 629 | !(aa.a.keyti.flags() & 1) ? BlkAttr.NO_SCAN : 0))[0 .. len * keysize]; |
|---|
| 632 | 630 | resi = 0; |
|---|
| 633 | 631 | foreach (e; aa.a.b) |
|---|
| … | … | |
| 781 | 779 | |
|---|
| 782 | 780 | result = new BB(); |
|---|
| | 781 | result.keyti = keyti; |
|---|
| 783 | 782 | size_t i; |
|---|
| 784 | 783 | |
|---|
| r2974 |
r3439 |
|
| 93 | 93 | aaA*[] b; |
|---|
| 94 | 94 | size_t nodes; // total number of aaA nodes |
|---|
| | 95 | TypeInfo keyti; // TODO: replace this with TypeInfo_AssociativeArray when available in _aaGet() |
|---|
| 95 | 96 | } |
|---|
| 96 | 97 | |
|---|
| … | … | |
| 259 | 260 | if (!aa.a) |
|---|
| 260 | 261 | aa.a = new BB(); |
|---|
| | 262 | aa.a.keyti = keyti; |
|---|
| 261 | 263 | |
|---|
| 262 | 264 | if (!aa.a.b.length) |
|---|
| … | … | |
| 288 | 290 | //printf("create new one\n"); |
|---|
| 289 | 291 | size_t size = aaA.sizeof + keysize + valuesize; |
|---|
| 290 | | uint bits = keysize < (void*).sizeof && |
|---|
| 291 | | keysize > (void).sizeof && |
|---|
| 292 | | valuesize < (void*).sizeof && |
|---|
| 293 | | valuesize > (void).sizeof ? BlkAttr.NO_SCAN : 0; |
|---|
| | 292 | uint bits = !(aa.a.keyti.flags() & 1) && |
|---|
| | 293 | valuesize < (void*).sizeof ? BlkAttr.NO_SCAN : 0; |
|---|
| 294 | 294 | e = cast(aaA *) gc_calloc(size, bits); |
|---|
| 295 | 295 | memcpy(e + 1, pkey, keysize); |
|---|
| … | … | |
| 492 | 492 | a.length = _aaLen(aa); |
|---|
| 493 | 493 | a.ptr = cast(byte*) gc_malloc(a.length * valuesize, |
|---|
| 494 | | valuesize < (void*).sizeof && |
|---|
| 495 | | valuesize > (void).sizeof ? BlkAttr.NO_SCAN : 0); |
|---|
| | 494 | valuesize < (void*).sizeof ? BlkAttr.NO_SCAN : 0); |
|---|
| 496 | 495 | resi = 0; |
|---|
| 497 | 496 | foreach (e; aa.a.b) |
|---|
| … | … | |
| 630 | 629 | return a; |
|---|
| 631 | 630 | res = (cast(byte*) gc_malloc(len * keysize, |
|---|
| 632 | | keysize < (void*).sizeof && |
|---|
| 633 | | keysize > (void).sizeof ? BlkAttr.NO_SCAN : 0))[0 .. len * keysize]; |
|---|
| | 631 | !(aa.a.keyti.flags() & 1) ? BlkAttr.NO_SCAN : 0))[0 .. len * keysize]; |
|---|
| 634 | 632 | resi = 0; |
|---|
| 635 | 633 | foreach (e; aa.a.b) |
|---|
| … | … | |
| 784 | 782 | |
|---|
| 785 | 783 | result = new BB(); |
|---|
| | 784 | result.keyti = keyti; |
|---|
| 786 | 785 | size_t i; |
|---|
| 787 | 786 | |
|---|
Download in other formats:
|
 |
 |
|
 |
Copyright © 2006-2008 Tango. All Rights Reserved. | Page Width:
Static or
Dynamic