diff options
-rw-r--r-- | hash.c | 16 | ||||
-rw-r--r-- | test/ruby/test_env.rb | 2 |
2 files changed, 14 insertions, 4 deletions
@@ -5931,8 +5931,16 @@ env_replace(VALUE env, VALUE hash) static int env_update_i(VALUE key, VALUE val, VALUE _) { - if (rb_block_given_p()) { - val = rb_yield_values(3, key, rb_f_getenv(Qnil, key), val); + env_aset(key, val); + return ST_CONTINUE; +} + +static int +env_update_block_i(VALUE key, VALUE val, VALUE _) +{ + VALUE oldval = rb_f_getenv(Qnil, key); + if (!NIL_P(oldval)) { + val = rb_yield_values(3, key, oldval, val); } env_aset(key, val); return ST_CONTINUE; @@ -5955,7 +5963,9 @@ env_update(VALUE env, VALUE hash) { if (env == hash) return env; hash = to_hash(hash); - rb_hash_foreach(hash, env_update_i, 0); + rb_foreach_func *func = rb_block_given_p() ? + env_update_block_i : env_update_i; + rb_hash_foreach(hash, func, 0); return env; } diff --git a/test/ruby/test_env.rb b/test/ruby/test_env.rb index d9301ff76c..ffce9b740c 100644 --- a/test/ruby/test_env.rb +++ b/test/ruby/test_env.rb @@ -445,7 +445,7 @@ class TestEnv < Test::Unit::TestCase ENV.clear ENV["foo"] = "bar" ENV["baz"] = "qux" - ENV.update({"baz"=>"quux","a"=>"b"}) {|k, v1, v2| v1 ? k + "_" + v1 + "_" + v2 : v2 } + ENV.update({"baz"=>"quux","a"=>"b"}) {|k, v1, v2| k + "_" + v1 + "_" + v2 } check(ENV.to_hash.to_a, [%w(foo bar), %w(baz baz_qux_quux), %w(a b)]) end |