From 279fce05ae34bd05a01c8b377a5f1b13b701cf83 Mon Sep 17 00:00:00 2001 From: Ryan Scott Date: Sun, 12 May 2013 19:49:56 +1000 Subject: ObjectSpace.count_objects was incorrectly checking if an object was already freed. Amended the count_objects test to ensure the correct distinction --- src/gc.c | 15 +++++++++------ test/t/objectspace.rb | 16 ++++++++++++++++ 2 files changed, 25 insertions(+), 6 deletions(-) diff --git a/src/gc.c b/src/gc.c index 6e3ba1d0e..375bbfd22 100644 --- a/src/gc.c +++ b/src/gc.c @@ -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; } diff --git a/test/t/objectspace.rb b/test/t/objectspace.rb index bf79da902..06319dcbb 100644 --- a/test/t/objectspace.rb +++ b/test/t/objectspace.rb @@ -16,4 +16,20 @@ assert('ObjectSpace.count_objects') do h0 = {:MRB_TT_FOO=>1000} h = ObjectSpace.count_objects(h0) assert_false(h0.has_key?(:MRB_TT_FOO)) + + GC.start + h_after = {} + h_before = ObjectSpace.count_objects + + objs = [] + 1000.times do + objs << {} + end + objs = nil + ObjectSpace.count_objects(h) + GC.start + ObjectSpace.count_objects(h_after) + + assert_equal(h_before[:MRB_TT_HASH] + 1000, h[:MRB_TT_HASH]) + assert_equal(h_before[:MRB_TT_HASH], h_after[:MRB_TT_HASH]) end \ No newline at end of file -- cgit v1.2.3