From 1cf7f66138c0279aced15fe37bb3a5ccb9eca3e5 Mon Sep 17 00:00:00 2001 From: Aaron Patterson Date: Fri, 16 Sep 2016 11:56:17 -0700 Subject: [PATCH 1/2] Add options to dump T_NONE objects and add page numbers --- ext/objspace/objspace_dump.c | 38 ++++++++++++++++++++++++++++++++++-- 1 file changed, 36 insertions(+), 2 deletions(-) diff --git a/ext/objspace/objspace_dump.c b/ext/objspace/objspace_dump.c index 127d33283ad0a7..b9265d5dc243fb 100644 --- a/ext/objspace/objspace_dump.c +++ b/ext/objspace/objspace_dump.c @@ -21,6 +21,7 @@ #include "objspace.h" static VALUE sym_output, sym_stdout, sym_string, sym_file; +static VALUE sym_include_pages, sym_include_none; struct dump_config { VALUE type; @@ -31,6 +32,9 @@ struct dump_config { VALUE cur_obj; VALUE cur_obj_klass; size_t cur_obj_references; + int include_pages; + int include_none; + int pages_seen; }; PRINTF_ARGS(static void dump_append(struct dump_config *, const char *, ...), 2, 3); @@ -190,6 +194,18 @@ dump_append_string_content(struct dump_config *dc, VALUE obj) } } +static void +dump_empty(VALUE obj, struct dump_config *dc) +{ + dump_append(dc, "{\"address\":\"%p\", ", (void *)obj); + dump_append(dc, "\"type\":\"NONE\""); + + if (dc->include_pages) + dump_append(dc, ", \"page_number\":%d", dc->pages_seen); + dump_append(dc, "}\n"); + return; +} + static void dump_object(VALUE obj, struct dump_config *dc) { @@ -215,6 +231,8 @@ dump_object(VALUE obj, struct dump_config *dc) if (dc->cur_obj_klass) dump_append(dc, ", \"class\":\"%p\"", (void *)dc->cur_obj_klass); + if (dc->include_pages) + dump_append(dc, ", \"page_number\":%d", dc->pages_seen); if (rb_obj_frozen_p(obj)) dump_append(dc, ", \"frozen\":true"); @@ -321,8 +339,11 @@ heap_i(void *vstart, void *vend, size_t stride, void *data) VALUE v = (VALUE)vstart; for (; v != (VALUE)vend; v += stride) { if (RBASIC(v)->flags) - dump_object(v, data); + dump_object(v, dc); + else if (dc->include_none && T_NONE == BUILTIN_TYPE(v)) + dump_empty(v, dc); } + dc->pages_seen++; return 0; } @@ -347,9 +368,20 @@ dump_output(struct dump_config *dc, VALUE opts, VALUE output, const char *filena { VALUE tmp; - if (RTEST(opts)) + dc->pages_seen = 0; + dc->include_pages = 0; + dc->include_none = 0; + + if (RTEST(opts)) { output = rb_hash_aref(opts, sym_output); + if (Qtrue == rb_hash_lookup2(opts, sym_include_pages, Qfalse)) + dc->include_pages = 1; + + if (Qtrue == rb_hash_lookup2(opts, sym_include_none, Qfalse)) + dc->include_none = 1; + } + if (output == sym_stdout) { dc->stream = stdout; dc->string = Qnil; @@ -474,6 +506,8 @@ Init_objspace_dump(VALUE rb_mObjSpace) sym_stdout = ID2SYM(rb_intern("stdout")); sym_string = ID2SYM(rb_intern("string")); sym_file = ID2SYM(rb_intern("file")); + sym_include_pages = ID2SYM(rb_intern("include_pages")); + sym_include_none = ID2SYM(rb_intern("include_none")); /* force create static IDs */ rb_obj_gc_flags(rb_mObjSpace, 0, 0); From b7ec21fb0a7069c82202d71d23e2d4b1cc387b87 Mon Sep 17 00:00:00 2001 From: Aaron Patterson Date: Tue, 20 Sep 2016 15:49:55 -0700 Subject: [PATCH 2/2] Revert "objspace_dump.c: dc is no longer used [ci skip]" This reverts commit cf6ca2d8b252cd9af0bec374693d2064842078dc. --- ext/objspace/objspace_dump.c | 1 + 1 file changed, 1 insertion(+) diff --git a/ext/objspace/objspace_dump.c b/ext/objspace/objspace_dump.c index b9265d5dc243fb..674bc781e63178 100644 --- a/ext/objspace/objspace_dump.c +++ b/ext/objspace/objspace_dump.c @@ -336,6 +336,7 @@ dump_object(VALUE obj, struct dump_config *dc) static int heap_i(void *vstart, void *vend, size_t stride, void *data) { + struct dump_config *dc = (struct dump_config *)data; VALUE v = (VALUE)vstart; for (; v != (VALUE)vend; v += stride) { if (RBASIC(v)->flags)