diff options
-rw-r--r-- | ext/objspace/objspace_dump.c | 118 |
1 files changed, 110 insertions, 8 deletions
@@ -18,6 +18,8 @@ #include "internal/hash.h" #include "internal/string.h" #include "internal/sanitizers.h" #include "node.h" #include "objspace.h" #include "ruby/debug.h" @@ -42,6 +44,7 @@ struct dump_config { unsigned int full_heap: 1; unsigned int partial_dump; size_t since; unsigned long buffer_len; char buffer[BUFFER_CAPACITY]; }; @@ -350,6 +353,20 @@ dump_append_string_content(struct dump_config *dc, VALUE obj) } } static void dump_object(VALUE obj, struct dump_config *dc) { @@ -378,13 +395,16 @@ dump_object(VALUE obj, struct dump_config *dc) dump_append(dc, "{\"address\":"); dump_append_ref(dc, obj); - dump_append(dc, ", \"shape_id\":"); - dump_append_sizet(dc, rb_shape_get_shape_id(obj)); - dump_append(dc, ", \"type\":\""); dump_append(dc, obj_type(obj)); dump_append(dc, "\""); dump_append(dc, ", \"slot_size\":"); dump_append_sizet(dc, dc->cur_page_slot_size); @@ -622,7 +642,7 @@ root_obj_i(const char *category, VALUE obj, void *data) } static void -dump_output(struct dump_config *dc, VALUE output, VALUE full, VALUE since) { dc->full_heap = 0; @@ -648,6 +668,8 @@ dump_output(struct dump_config *dc, VALUE output, VALUE full, VALUE since) else { dc->partial_dump = 0; } } static VALUE @@ -672,18 +694,81 @@ objspace_dump(VALUE os, VALUE obj, VALUE output) dc.cur_page_slot_size = rb_gc_obj_slot_size(obj); } - dump_output(&dc, output, Qnil, Qnil); dump_object(obj, &dc); return dump_result(&dc); } static VALUE -objspace_dump_all(VALUE os, VALUE output, VALUE full, VALUE since) { struct dump_config dc = {0,}; - dump_output(&dc, output, full, since); if (!dc.partial_dump || dc.since == 0) { /* dump roots */ @@ -691,12 +776,28 @@ objspace_dump_all(VALUE os, VALUE output, VALUE full, VALUE since) if (dc.roots) dump_append(&dc, "]}\n"); } /* dump all objects */ rb_objspace_each_objects(heap_i, &dc); return dump_result(&dc); } void Init_objspace_dump(VALUE rb_mObjSpace) { @@ -706,7 +807,8 @@ Init_objspace_dump(VALUE rb_mObjSpace) #endif rb_define_module_function(rb_mObjSpace, "_dump", objspace_dump, 2); - rb_define_module_function(rb_mObjSpace, "_dump_all", objspace_dump_all, 3); /* force create static IDs */ rb_obj_gc_flags(rb_mObjSpace, 0, 0); |