diff options
author | akr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2008-04-26 12:52:25 +0000 |
---|---|---|
committer | akr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2008-04-26 12:52:25 +0000 |
commit | 514715250a2a4d69ea0a4ce3123e2e2f558f3109 (patch) | |
tree | c8b543090edb6016a11fda3b22c55b4eb5b01cea | |
parent | 6fb36ebab0644f2b724b144b0a163148c87298aa (diff) | |
download | ruby-514715250a2a4d69ea0a4ce3123e2e2f558f3109.tar.gz |
* 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.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@16210 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | ChangeLog | 8 | ||||
-rw-r--r-- | hash.c | 13 | ||||
-rw-r--r-- | include/ruby/intern.h | 1 | ||||
-rw-r--r-- | process.c | 4 | ||||
-rw-r--r-- | test/ruby/test_process.rb | 15 |
5 files changed, 41 insertions, 0 deletions
@@ -1,3 +1,11 @@ +Sat Apr 26 21:30:40 2008 Tanaka Akira <akr@fsij.org> + + * 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@ruby-lang.org> * io.c, signal.c, thread.c, thread_win32.c, include/ruby/intern.h: @@ -228,6 +228,19 @@ rb_hash_new(void) 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) { diff --git a/include/ruby/intern.h b/include/ruby/intern.h index 5272079df7..4df92419b4 100644 --- a/include/ruby/intern.h +++ b/include/ruby/intern.h @@ -344,6 +344,7 @@ void st_foreach_safe(struct st_table *, int (*)(ANYARGS), st_data_t); 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); @@ -2560,6 +2560,10 @@ rb_spawn_internal(int argc, VALUE *argv, int default_close_others) 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); } diff --git a/test/ruby/test_process.rb b/test/ruby/test_process.rb index e68f1070e6..36cc5d14a7 100644 --- a/test/ruby/test_process.rb +++ b/test/ruby/test_process.rb @@ -500,6 +500,21 @@ class TestProcess < Test::Unit::TestCase } 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])) |