summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorRyan Scott <[email protected]>2013-05-12 19:49:56 +1000
committerRyan Scott <[email protected]>2013-05-12 19:49:56 +1000
commit279fce05ae34bd05a01c8b377a5f1b13b701cf83 (patch)
tree8467ebd6300a1a5612971d7f8b7f072cd23d53a4
parentc2d1105aa9190f12577e7b63c22f659c1d1155ab (diff)
downloadmruby-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
-rw-r--r--src/gc.c15
-rw-r--r--test/t/objectspace.rb16
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