diff options
| author | Ryan Scott <[email protected]> | 2013-05-12 19:49:56 +1000 |
|---|---|---|
| committer | Ryan Scott <[email protected]> | 2013-05-12 19:49:56 +1000 |
| commit | 279fce05ae34bd05a01c8b377a5f1b13b701cf83 (patch) | |
| tree | 8467ebd6300a1a5612971d7f8b7f072cd23d53a4 /src | |
| parent | c2d1105aa9190f12577e7b63c22f659c1d1155ab (diff) | |
| download | mruby-279fce05ae34bd05a01c8b377a5f1b13b701cf83.tar.gz mruby-279fce05ae34bd05a01c8b377a5f1b13b701cf83.zip | |
ObjectSpace.count_objects was incorrectly checking if an object was already freed. Amended the count_objects test to ensure the correct distinction
Diffstat (limited to 'src')
| -rw-r--r-- | src/gc.c | 15 |
1 files changed, 9 insertions, 6 deletions
@@ -1168,6 +1168,7 @@ mrb_value os_count_objects(mrb_state *mrb, mrb_value self) size_t total = 0; size_t i; mrb_value hash; + RVALUE *free; struct heap_page* page = mrb->heaps; if (mrb_get_args(mrb, "|H", &hash) == 0) { @@ -1188,13 +1189,15 @@ mrb_value os_count_objects(mrb_state *mrb, mrb_value self) p = page->objects; pend = p + MRB_HEAP_PAGE_SIZE; for (;p < pend; p++) { - if (p->as.basic.flags) { - counts[mrb_type(p->as.basic)]++; - } - else { - freed++; - } + counts[mrb_type(p->as.basic)]++; } + + free = (RVALUE*)page->freelist; + while (free) { + freed++; + free = (RVALUE*)free->as.free.next; + } + total += MRB_HEAP_PAGE_SIZE; page = page->next; } |
