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":/
|
||