зеркало из https://github.com/github/ruby.git
Copy compare_by_identity flag for empty hashes in Hash.ruby2_keywords_hash
This was already copied for non-empty hashes. As Hash.ruby2_keywords_hash copies default values, it should also copy the compare_by_identity flag. Partially Fixes [Bug #19113]
This commit is contained in:
Родитель
d3197def88
Коммит
1b13db25d8
9
hash.c
9
hash.c
|
@ -1972,9 +1972,12 @@ static VALUE
|
|||
rb_hash_s_ruby2_keywords_hash(VALUE dummy, VALUE hash)
|
||||
{
|
||||
Check_Type(hash, T_HASH);
|
||||
hash = rb_hash_dup(hash);
|
||||
RHASH(hash)->basic.flags |= RHASH_PASS_AS_KEYWORDS;
|
||||
return hash;
|
||||
VALUE tmp = rb_hash_dup(hash);
|
||||
if (RHASH_EMPTY_P(hash) && rb_hash_compare_by_id_p(hash)) {
|
||||
rb_hash_compare_by_id(tmp);
|
||||
}
|
||||
RHASH(tmp)->basic.flags |= RHASH_PASS_AS_KEYWORDS;
|
||||
return tmp;
|
||||
}
|
||||
|
||||
struct rehash_arg {
|
||||
|
|
|
@ -56,4 +56,28 @@ describe "Hash.ruby2_keywords_hash" do
|
|||
it "raises TypeError for non-Hash" do
|
||||
-> { Hash.ruby2_keywords_hash(nil) }.should raise_error(TypeError)
|
||||
end
|
||||
|
||||
it "retains the default value" do
|
||||
hash = Hash.new(1)
|
||||
Hash.ruby2_keywords_hash(hash).default.should == 1
|
||||
hash[:a] = 1
|
||||
Hash.ruby2_keywords_hash(hash).default.should == 1
|
||||
end
|
||||
|
||||
it "retains the default_proc" do
|
||||
pr = proc { |h, k| h[k] = [] }
|
||||
hash = Hash.new(&pr)
|
||||
Hash.ruby2_keywords_hash(hash).default_proc.should == pr
|
||||
hash[:a] = 1
|
||||
Hash.ruby2_keywords_hash(hash).default_proc.should == pr
|
||||
end
|
||||
|
||||
ruby_version_is '3.3' do
|
||||
it "retains compare_by_identity_flag" do
|
||||
hash = {}.compare_by_identity
|
||||
Hash.ruby2_keywords_hash(hash).compare_by_identity?.should == true
|
||||
hash[:a] = 1
|
||||
Hash.ruby2_keywords_hash(hash).compare_by_identity?.should == true
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
Загрузка…
Ссылка в новой задаче