| 81 | } |
| 82 | |
| 83 | void* |
| 84 | Region::heap_alloc(size_t s) { |
| 85 | void* p = heap.ralloc(s); |
| 86 | if (hi == nullptr) { |
| 87 | hi = p; |
| 88 | assert(!Support::marked(hi)); |
| 89 | } else if (!Support::marked(hi)) { |
| 90 | HeapInfo* h = static_cast<HeapInfo*> |
| 91 | (heap.ralloc(sizeof(HeapInfo)+(4-1)*sizeof(void*))); |
| 92 | h->n=2; h->size=4; |
| 93 | h->blocks[0]=hi; h->blocks[1]=p; |
| 94 | hi = Support::mark(h); |
| 95 | } else { |
| 96 | HeapInfo* h = static_cast<HeapInfo*>(Support::unmark(hi)); |
| 97 | if (h->n == h->size) { |
| 98 | HeapInfo* n = static_cast<HeapInfo*> |
| 99 | (heap.ralloc(sizeof(HeapInfo)+(2*h->n-1)*sizeof(void*))); |
| 100 | n->size = 2*h->n; |
| 101 | n->n = h->n; |
| 102 | memcpy(&n->blocks[0], &h->blocks[0], h->n*sizeof(void*)); |
| 103 | hi = Support::mark(n); |
| 104 | heap.rfree(h); |
| 105 | h = n; |
| 106 | } |
| 107 | h->blocks[h->n++] = p; |
| 108 | } |
| 109 | return p; |
| 110 | } |
| 111 | |
| 112 | void |
| 113 | Region::heap_free(void) { |