mirror of
https://github.com/mruby/mruby
synced 2026-06-08 16:11:16 +00:00
ObjectSpace.count_objects was incorrectly checking if an object was already freed. Amended the count_objects test to ensure the correct distinction
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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
|
||||
Reference in New Issue
Block a user