From 90feeb6ab9c9f02a174ac27a5c3bcee6f23aa463 Mon Sep 17 00:00:00 2001 From: nobu Date: Sat, 9 Nov 2013 06:16:53 +0000 Subject: objspace_dump.c: extract output option utilities * ext/objspace/objspace_dump.c (dump_output, dump_result): extract output option utility functions from objspace_dump() and objspace_dump_all(). git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@43607 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ext/objspace/objspace_dump.c | 89 ++++++++++++++++++++++---------------------- 1 file changed, 44 insertions(+), 45 deletions(-) (limited to 'ext') diff --git a/ext/objspace/objspace_dump.c b/ext/objspace/objspace_dump.c index e3124b0af5..f52b194497 100644 --- a/ext/objspace/objspace_dump.c +++ b/ext/objspace/objspace_dump.c @@ -290,6 +290,46 @@ root_obj_i(const char *category, VALUE obj, void *data) dc->roots++; } +static VALUE +dump_output(struct dump_config *dc, VALUE opts, VALUE output, char *filename) +{ + if (RTEST(opts)) + output = rb_hash_aref(opts, sym_output); + + if (output == sym_stdout) { + dc->stream = stdout; + dc->string = Qnil; + } + else if (output == sym_file) { + int fd = mkstemp(filename); + dc->string = rb_filesystem_str_new_cstr(filename); + if (fd == -1) rb_sys_fail_path(dc->string); + dc->stream = fdopen(fd, "w"); + } + else if (output == sym_string) { + dc->string = rb_str_new_cstr(""); + } + else { + rb_raise(rb_eArgError, "wrong output option: %"PRIsVALUE, output); + } + return output; +} + +static VALUE +dump_result(struct dump_config *dc, VALUE output) +{ + if (output == sym_string) { + return dc->string; + } + else if (output == sym_file) { + fclose(dc->stream); + return dc->string; + } + else { + return Qnil; + } +} + /* * call-seq: * ObjectSpace.dump(obj[, output: :string]) # => "{ ... }" @@ -307,38 +347,17 @@ root_obj_i(const char *category, VALUE obj, void *data) static VALUE objspace_dump(int argc, VALUE *argv, VALUE os) { - int fd; char filename[] = "/tmp/rubyobjXXXXXX"; VALUE obj = Qnil, opts = Qnil, output; struct dump_config dc = {0,}; rb_scan_args(argc, argv, "1:", &obj, &opts); - if (RTEST(opts)) - output = rb_hash_aref(opts, sym_output); - - if (output == sym_stdout) - dc.stream = stdout; - else if (output == sym_file) { - fd = mkstemp(filename); - if (fd == -1) rb_sys_fail_path(rb_str_new_cstr(filename)); - dc.stream = fdopen(fd, "w"); - } - else { - output = sym_string; - dc.string = rb_str_new2(""); - } + output = dump_output(&dc, opts, sym_string, filename); dump_object(obj, &dc); - if (output == sym_string) - return dc.string; - else if (output == sym_file) { - fclose(dc.stream); - return rb_str_new2(filename); - } - else - return Qnil; + return dump_result(&dc, output); } /* @@ -358,26 +377,13 @@ objspace_dump(int argc, VALUE *argv, VALUE os) static VALUE objspace_dump_all(int argc, VALUE *argv, VALUE os) { - int fd; char filename[] = "/tmp/rubyheapXXXXXX"; VALUE opts = Qnil, output; struct dump_config dc = {0,}; rb_scan_args(argc, argv, "0:", &opts); - if (RTEST(opts)) - output = rb_hash_aref(opts, sym_output); - - if (output == sym_string) - dc.string = rb_str_new2(""); - else if (output == sym_stdout) - dc.stream = stdout; - else { - output = sym_file; - fd = mkstemp(filename); - if (fd == -1) rb_sys_fail_path(rb_str_new_cstr(filename)); - dc.stream = fdopen(fd, "w"); - } + output = dump_output(&dc, opts, sym_file, filename); /* dump roots */ rb_objspace_reachable_objects_from_root(root_obj_i, &dc); @@ -386,14 +392,7 @@ objspace_dump_all(int argc, VALUE *argv, VALUE os) /* dump all objects */ rb_objspace_each_objects(heap_i, &dc); - if (output == sym_string) - return dc.string; - else if (output == sym_file) { - fclose(dc.stream); - return rb_str_new2(filename); - } - else - return Qnil; + return dump_result(&dc, output); } void -- cgit v1.2.3