ruby-changes:31528
From: nobu <ko1@a...>
Date: Sat, 9 Nov 2013 15:17:00 +0900 (JST)
Subject: [ruby-changes:31528] nobu:r43607 (trunk): objspace_dump.c: extract output option utilities
nobu 2013-11-09 15:16:53 +0900 (Sat, 09 Nov 2013) New Revision: 43607 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=43607 Log: 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(). Modified files: trunk/ext/objspace/objspace_dump.c Index: ext/objspace/objspace_dump.c =================================================================== --- ext/objspace/objspace_dump.c (revision 43606) +++ ext/objspace/objspace_dump.c (revision 43607) @@ -290,6 +290,46 @@ root_obj_i(const char *category, VALUE o https://github.com/ruby/ruby/blob/trunk/ext/objspace/objspace_dump.c#L290 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 o https://github.com/ruby/ruby/blob/trunk/ext/objspace/objspace_dump.c#L347 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, VAL https://github.com/ruby/ruby/blob/trunk/ext/objspace/objspace_dump.c#L377 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, https://github.com/ruby/ruby/blob/trunk/ext/objspace/objspace_dump.c#L392 /* 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 -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/