Skip to content

Commit

Permalink
Add the size pool slot size to the output of ObjectSpace.dump/dump_all
Browse files Browse the repository at this point in the history
  • Loading branch information
eightbitraptor authored and peterzhu2118 committed Feb 3, 2022
1 parent a3caf19 commit 9fab2c1
Show file tree
Hide file tree
Showing 3 changed files with 39 additions and 0 deletions.
9 changes: 9 additions & 0 deletions ext/objspace/objspace_dump.c
Expand Up @@ -35,6 +35,7 @@ struct dump_config {
const char *root_category;
VALUE cur_obj;
VALUE cur_obj_klass;
size_t cur_page_slot_size;
size_t cur_obj_references;
unsigned int roots: 1;
unsigned int full_heap: 1;
Expand Down Expand Up @@ -360,6 +361,9 @@ dump_object(VALUE obj, struct dump_config *dc)
dump_append(dc, obj_type(obj));
dump_append(dc, "\"");

dump_append(dc, ", \"slot_size\":");
dump_append_sizet(dc, dc->cur_page_slot_size);

if (dc->cur_obj_klass) {
dump_append(dc, ", \"class\":");
dump_append_ref(dc, dc->cur_obj_klass);
Expand Down Expand Up @@ -539,6 +543,7 @@ heap_i(void *vstart, void *vend, size_t stride, void *data)
for (; v != (VALUE)vend; v += stride) {
void *ptr = asan_poisoned_object_p(v);
asan_unpoison_object(v, false);
dc->cur_page_slot_size = stride;

if (dc->full_heap || RBASIC(v)->flags)
dump_object(v, dc);
Expand Down Expand Up @@ -616,6 +621,10 @@ static VALUE
objspace_dump(VALUE os, VALUE obj, VALUE output)
{
struct dump_config dc = {0,};
if (!RB_SPECIAL_CONST_P(obj)) {
dc.cur_page_slot_size = rb_gc_obj_slot_size(obj);
}

dump_output(&dc, output, Qnil, Qnil);

dump_object(obj, &dc);
Expand Down
2 changes: 2 additions & 0 deletions gc.h
Expand Up @@ -136,6 +136,8 @@ void rb_objspace_each_objects_without_setup(
int (*callback)(void *, void *, size_t, void *),
void *data);

size_t rb_gc_obj_slot_size(VALUE obj);

RUBY_SYMBOL_EXPORT_END

#endif /* RUBY_GC_H */
28 changes: 28 additions & 0 deletions test/objspace/test_objspace.rb
Expand Up @@ -431,6 +431,27 @@ def dump_my_heap_please
end
end

def test_dump_objects_dumps_page_slot_sizes
assert_in_out_err(%w[-robjspace], "#{<<-"begin;"}\n#{<<-'end;'}") do |output, error|
begin;
def dump_my_heap_please
ObjectSpace.dump_all(output: $stdout)
end
p $stdout == dump_my_heap_please
end;
assert_equal 'true', output.pop
assert(output.count > 1)
output.each { |l|
obj = JSON.parse(l)
next if obj["type"] == "ROOT"

assert(obj["slot_size"] != nil)
assert(obj["slot_size"] % GC::INTERNAL_CONSTANTS[:BASE_SLOT_SIZE] == 0)
}
end
end

def test_dump_escapes_method_name
method_name = "foo\"bar"
klass = Class.new do
Expand All @@ -449,6 +470,13 @@ def test_dump_escapes_method_name
ObjectSpace.trace_object_allocations_stop
end

def test_dump_includes_slot_size
str = "TEST"
dump = ObjectSpace.dump(str)

assert_includes dump, "\"slot_size\":#{GC::INTERNAL_CONSTANTS[:BASE_SLOT_SIZE]}"
end

def test_dump_reference_addresses_match_dump_all_addresses
assert_in_out_err(%w[-robjspace], "#{<<-"begin;"}\n#{<<-'end;'}") do |output, error|
begin;
Expand Down

0 comments on commit 9fab2c1

Please sign in to comment.