Project

General

Profile

Feature #13001 ยป 0001-Add-full-option-to-ObjectSpace.dump_all.patch

tenderlovemaking (Aaron Patterson), 12/02/2016 09:23 PM

View differences:

ext/objspace/objspace_dump.c
#include "objspace.h"
static VALUE sym_output, sym_stdout, sym_string, sym_file;
static VALUE sym_full;
struct dump_config {
VALUE type;
......
VALUE cur_obj;
VALUE cur_obj_klass;
size_t cur_obj_references;
int full_heap;
};
PRINTF_ARGS(static void dump_append(struct dump_config *, const char *, ...), 2, 3);
......
dump_append(dc, ", \"frozen\":true");
switch (BUILTIN_TYPE(obj)) {
case T_NONE:
dump_append(dc, "}\n");
return;
case T_NODE:
dump_append(dc, ", \"node_type\":\"%s\"", ruby_node_name(nd_type(obj)));
break;
......
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)
dump_object(v, data);
if (dc->full_heap || RBASIC(v)->flags)
dump_object(v, dc);
}
return 0;
}
......
{
VALUE tmp;
if (RTEST(opts))
dc->full_heap = 0;
if (RTEST(opts)) {
output = rb_hash_aref(opts, sym_output);
if (Qtrue == rb_hash_lookup2(opts, sym_full, Qfalse))
dc->full_heap = 1;
}
if (output == sym_stdout) {
dc->stream = stdout;
dc->string = Qnil;
......
sym_stdout = ID2SYM(rb_intern("stdout"));
sym_string = ID2SYM(rb_intern("string"));
sym_file = ID2SYM(rb_intern("file"));
sym_full = ID2SYM(rb_intern("full"));
/* force create static IDs */
rb_obj_gc_flags(rb_mObjSpace, 0, 0);
test/objspace/test_objspace.rb
assert_match /"value":"foobar\h+"/, dump
end
def test_dump_all_full
assert_in_out_err(%w[-robjspace], <<-'end;') do |output, error|
def dump_my_heap_please
ObjectSpace.dump_all(output: :stdout, full: true)
end
dump_my_heap_please
end;
heap = output.find_all { |l| JSON.parse(l)['type'] == "NONE" }
assert_operator heap.length, :>, 0
end
end
def test_dump_all
entry = /"bytesize":11, "value":"TEST STRING", "encoding":"UTF-8", "file":"-", "line":4, "method":"dump_my_heap_please", "generation":/
    (1-1/1)