Feature #13001 ยป 0001-Add-full-option-to-ObjectSpace.dump_all.patch
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":/
|
||