1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

Compare environment variable names in those manor [Bug #16798]

This commit is contained in:
Nobuyoshi Nakada 2020-04-18 20:39:07 +09:00
parent e042380e0e
commit 08529a6115
Notes: git 2020-04-18 23:09:30 +09:00
2 changed files with 21 additions and 3 deletions

22
hash.c
View file

@ -6343,13 +6343,29 @@ env_invert(VALUE _)
return rb_hash_invert(env_to_hash());
}
static void
keylist_delete(VALUE keys, VALUE key)
{
long keylen, elen;
const char *keyptr, *eptr;
RSTRING_GETMEM(key, keyptr, keylen);
for (long i=0; i<RARRAY_LEN(keys); i++) {
VALUE e = RARRAY_AREF(keys, i);
RSTRING_GETMEM(e, eptr, elen);
if (elen != keylen) continue;
if (!ENVNMATCH(keyptr, eptr, elen)) continue;
rb_ary_delete_at(keys, i);
return;
}
}
static int
env_replace_i(VALUE key, VALUE val, VALUE keys)
{
env_name(key);
env_aset(key, val);
if (rb_ary_includes(keys, key)) {
rb_ary_delete(keys, key);
}
keylist_delete(keys, key);
return ST_CONTINUE;
}

View file

@ -433,6 +433,8 @@ class TestEnv < Test::Unit::TestCase
ENV["foo"] = "xxx"
ENV.replace({"foo"=>"bar", "baz"=>"qux"})
check(ENV.to_hash.to_a, [%w(foo bar), %w(baz qux)])
ENV.replace({"Foo"=>"Bar", "Baz"=>"Qux"})
check(ENV.to_hash.to_a, [%w(Foo Bar), %w(Baz Qux)])
end
def test_update