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

ruby-changes:31600

From: nobu <ko1@a...>
Date: Fri, 15 Nov 2013 01:06:17 +0900 (JST)
Subject: [ruby-changes:31600] nobu:r43679 (trunk): objspace_dump.c: refine output

nobu	2013-11-15 01:06:09 +0900 (Fri, 15 Nov 2013)

  New Revision: 43679

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=43679

  Log:
    objspace_dump.c: refine output
    
    * ext/objspace/objspace_dump.c (dump_output): allow IO object as
      output, and use Tempfile.create and return open file instead of
      mkstemp() and path name for :file output.
      [ruby-core:58266] [Bug #9102]
    * test/objspace/test_objspace.rb (TestObjSpace#dump_my_heap_please):
      remove temporary output file.

  Modified files:
    trunk/ChangeLog
    trunk/ext/objspace/extconf.rb
    trunk/ext/objspace/objspace_dump.c
    trunk/test/objspace/test_objspace.rb
Index: ChangeLog
===================================================================
--- ChangeLog	(revision 43678)
+++ ChangeLog	(revision 43679)
@@ -1,3 +1,13 @@ https://github.com/ruby/ruby/blob/trunk/ChangeLog#L1
+Fri Nov 15 01:06:04 2013  Nobuyoshi Nakada  <nobu@r...>
+
+	* ext/objspace/objspace_dump.c (dump_output): allow IO object as
+	  output, and use Tempfile.create and return open file instead of
+	  mkstemp() and path name for :file output.
+	  [ruby-core:58266] [Bug #9102]
+
+	* test/objspace/test_objspace.rb (TestObjSpace#dump_my_heap_please):
+	  remove temporary output file.
+
 Thu Nov 14 23:39:00 2013  CHIKANAGA Tomoyuki  <nagachika@r...>
 
 	* ext/bigdecimal/lib/bigdecimal/util.rb: [DOC] remove example of
Index: ext/objspace/extconf.rb
===================================================================
--- ext/objspace/extconf.rb	(revision 43678)
+++ ext/objspace/extconf.rb	(revision 43679)
@@ -1,3 +1,2 @@ https://github.com/ruby/ruby/blob/trunk/ext/objspace/extconf.rb#L1
 $INCFLAGS << " -I$(topdir) -I$(top_srcdir)"
-have_func("mkstemp")
 create_makefile('objspace')
Index: ext/objspace/objspace_dump.c
===================================================================
--- ext/objspace/objspace_dump.c	(revision 43678)
+++ ext/objspace/objspace_dump.c	(revision 43679)
@@ -276,12 +276,11 @@ root_obj_i(const char *category, VALUE o https://github.com/ruby/ruby/blob/trunk/ext/objspace/objspace_dump.c#L276
     dc->roots++;
 }
 
-#ifndef HAVE_MKSTEMP
-#define dump_output(dc, opts, output, filename) dump_output(dc, opts, output)
-#endif
 static VALUE
-dump_output(struct dump_config *dc, VALUE opts, VALUE output, char *filename)
+dump_output(struct dump_config *dc, VALUE opts, VALUE output, const char *filename)
 {
+    VALUE tmp;
+
     if (RTEST(opts))
 	output = rb_hash_aref(opts, sym_output);
 
@@ -290,18 +289,23 @@ dump_output(struct dump_config *dc, VALU https://github.com/ruby/ruby/blob/trunk/ext/objspace/objspace_dump.c#L289
 	dc->string = Qnil;
     }
     else if (output == sym_file) {
-#ifdef HAVE_MKSTEMP
-	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
-	rb_raise(rb_eArgError, "output to temprary file is not supported");
-#endif
+	rb_io_t *fptr;
+	rb_require("tempfile");
+	tmp = rb_assoc_new(rb_str_new_cstr(filename), rb_str_new_cstr(".json"));
+	tmp = rb_funcallv(rb_path2class("Tempfile"), rb_intern("create"), 1, &tmp);
+      io:
+	dc->string = rb_io_get_write_io(tmp);
+	rb_io_flush(dc->string);
+	GetOpenFile(dc->string, fptr);
+	dc->stream = rb_io_stdio_file(fptr);
     }
     else if (output == sym_string) {
 	dc->string = rb_str_new_cstr("");
     }
+    else if (!NIL_P(tmp = rb_io_check_io(output))) {
+	output = sym_file;
+	goto io;
+    }
     else {
 	rb_raise(rb_eArgError, "wrong output option: %"PRIsVALUE, output);
     }
@@ -315,7 +319,7 @@ dump_result(struct dump_config *dc, VALU https://github.com/ruby/ruby/blob/trunk/ext/objspace/objspace_dump.c#L319
 	return dc->string;
     }
     else if (output == sym_file) {
-	fclose(dc->stream);
+	rb_io_flush(dc->string);
 	return dc->string;
     }
     else {
@@ -340,9 +344,7 @@ dump_result(struct dump_config *dc, VALU https://github.com/ruby/ruby/blob/trunk/ext/objspace/objspace_dump.c#L344
 static VALUE
 objspace_dump(int argc, VALUE *argv, VALUE os)
 {
-#ifdef HAVE_MKSTEMP
-    char filename[] = "/tmp/rubyobjXXXXXX";
-#endif
+    static const char filename[] = "rubyobj";
     VALUE obj = Qnil, opts = Qnil, output;
     struct dump_config dc = {0,};
 
@@ -372,9 +374,7 @@ objspace_dump(int argc, VALUE *argv, VAL https://github.com/ruby/ruby/blob/trunk/ext/objspace/objspace_dump.c#L374
 static VALUE
 objspace_dump_all(int argc, VALUE *argv, VALUE os)
 {
-#ifdef HAVE_MKSTEMP
-    char filename[] = "/tmp/rubyheapXXXXXX";
-#endif
+    static const char filename[] = "rubyheap";
     VALUE opts = Qnil, output;
     struct dump_config dc = {0,};
 
Index: test/objspace/test_objspace.rb
===================================================================
--- test/objspace/test_objspace.rb	(revision 43678)
+++ test/objspace/test_objspace.rb	(revision 43679)
@@ -204,17 +204,38 @@ class TestObjSpace < Test::Unit::TestCas https://github.com/ruby/ruby/blob/trunk/test/objspace/test_objspace.rb#L204
     end
   end
 
-  def test_dump
+  def test_dump_to_default
+    line = nil
     info = nil
     ObjectSpace.trace_object_allocations do
+      line = __LINE__ + 1
       str = "hello world"
       info = ObjectSpace.dump(str)
     end
+    assert_dump_object(info, line)
+  end
+
+  def test_dump_to_io
+    line = nil
+    info = IO.pipe do |r, w|
+      th = Thread.start {r.read}
+      ObjectSpace.trace_object_allocations do
+        line = __LINE__ + 1
+        str = "hello world"
+        ObjectSpace.dump(str, output: w)
+      end
+      w.close
+      th.value
+    end
+    assert_dump_object(info, line)
+  end
 
+  def assert_dump_object(info, line)
+    loc = caller_locations(1, 1)[0]
     assert_match /"type":"STRING"/, info
     assert_match /"embedded":true, "bytesize":11, "value":"hello world", "encoding":"UTF-8"/, info
-    assert_match /"file":"#{Regexp.escape __FILE__}", "line":#{__LINE__-6}/, info
-    assert_match /"method":"test_dump"/, info
+    assert_match /"file":"#{Regexp.escape __FILE__}", "line":#{line}/, info
+    assert_match /"method":"#{loc.base_label}"/, info
   end
 
   def test_dump_all
@@ -235,13 +256,14 @@ class TestObjSpace < Test::Unit::TestCas https://github.com/ruby/ruby/blob/trunk/test/objspace/test_objspace.rb#L256
         ObjectSpace.trace_object_allocations_start
         GC.start
         "TEST STRING".force_encoding("UTF-8")
-        ObjectSpace.dump_all()
+        ObjectSpace.dump_all().path
       end
 
       puts dump_my_heap_please
     end;
       skip if /is not supported/ =~ error
       assert_match(entry, File.read(output))
+      File.unlink(output)
     end
   end
 end

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

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