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

ruby-changes:4716

From: ko1@a...
Date: Sat, 26 Apr 2008 21:52:42 +0900 (JST)
Subject: [ruby-changes:4716] akr - Ruby:r16210 (trunk): * include/ruby/intern.h (rb_hash_dup): declared.

akr	2008-04-26 21:52:25 +0900 (Sat, 26 Apr 2008)

  New Revision: 16210

  Modified files:
    trunk/ChangeLog
    trunk/hash.c
    trunk/include/ruby/intern.h
    trunk/process.c
    trunk/test/ruby/test_process.rb

  Log:
    * include/ruby/intern.h (rb_hash_dup): declared.
    
    * hash.c (rb_hash_dup): new function.
    
    * process.c (rb_spawn_internal): don't modify option hash.
    


  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/hash.c?r1=16210&r2=16209&diff_format=u
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/test/ruby/test_process.rb?r1=16210&r2=16209&diff_format=u
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/ChangeLog?r1=16210&r2=16209&diff_format=u
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/process.c?r1=16210&r2=16209&diff_format=u
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/include/ruby/intern.h?r1=16210&r2=16209&diff_format=u

Index: include/ruby/intern.h
===================================================================
--- include/ruby/intern.h	(revision 16209)
+++ include/ruby/intern.h	(revision 16210)
@@ -344,6 +344,7 @@
 void rb_hash_foreach(VALUE, int (*)(ANYARGS), VALUE);
 VALUE rb_hash(VALUE);
 VALUE rb_hash_new(void);
+VALUE rb_hash_dup(VALUE);
 VALUE rb_hash_freeze(VALUE);
 VALUE rb_hash_aref(VALUE, VALUE);
 VALUE rb_hash_lookup(VALUE, VALUE);
Index: ChangeLog
===================================================================
--- ChangeLog	(revision 16209)
+++ ChangeLog	(revision 16210)
@@ -1,3 +1,11 @@
+Sat Apr 26 21:30:40 2008  Tanaka Akira  <akr@f...>
+
+	* include/ruby/intern.h (rb_hash_dup): declared.
+
+	* hash.c (rb_hash_dup): new function.
+	
+	* process.c (rb_spawn_internal): don't modify option hash.
+
 Sat Apr 26 18:36:31 2008  Nobuyoshi Nakada  <nobu@r...>
 
 	* io.c, signal.c, thread.c, thread_win32.c, include/ruby/intern.h:
Index: process.c
===================================================================
--- process.c	(revision 16209)
+++ process.c	(revision 16210)
@@ -2560,6 +2560,10 @@
             opthash = rb_hash_new();
             RBASIC(opthash)->klass = 0;
         }
+        if (RBASIC(opthash)->klass) {
+            opthash = rb_hash_dup(opthash);
+            RBASIC(opthash)->klass = 0;
+        }
         if (!st_lookup(RHASH_TBL(opthash), close_others, 0))
             rb_hash_aset(opthash, close_others, Qtrue);
     }
Index: hash.c
===================================================================
--- hash.c	(revision 16209)
+++ hash.c	(revision 16210)
@@ -228,6 +228,19 @@
     return hash_alloc(rb_cHash);
 }
 
+VALUE
+rb_hash_dup(VALUE hash)
+{
+    VALUE ret = hash_alloc(RBASIC(hash)->klass);
+    if (!RHASH_EMPTY_P(hash))
+        RHASH(ret)->ntbl = st_copy(RHASH(hash)->ntbl);
+    if (FL_TEST(hash, HASH_PROC_DEFAULT)) {
+        FL_SET(ret, HASH_PROC_DEFAULT);
+    }
+    RHASH(ret)->ifnone = RHASH(hash)->ifnone;
+    return ret;
+}
+
 static void
 rb_hash_modify_check(VALUE hash)
 {
Index: test/ruby/test_process.rb
===================================================================
--- test/ruby/test_process.rb	(revision 16209)
+++ test/ruby/test_process.rb	(revision 16210)
@@ -500,6 +500,21 @@
     }
   end
 
+  def test_execopts_modification
+    h = {}
+    Process.wait spawn(EnvUtil.rubybin, '-e', '', h)
+    assert_equal({}, h)
+
+    h = {}
+    system(EnvUtil.rubybin, '-e', '', h)
+    assert_equal({}, h)
+
+    h = {}
+    io = IO.popen([EnvUtil.rubybin, '-e', '', h])
+    io.close
+    assert_equal({}, h)
+  end
+
   def test_system
     str = "echo fofo"
     assert_nil(system([str, str]))

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

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