[前][次][番号順一覧][スレッド一覧]

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/

[前][次][番号順一覧][スレッド一覧]