summaryrefslogtreecommitdiff
path: root/ext/objspace/objspace_dump.c
diff options
context:
space:
mode:
-rw-r--r--ext/objspace/objspace_dump.c118
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);