hash.c: compare symbols by identities

* hash.c (rb_any_hash): Symbols are compared by the identities
  always.  [ruby-core:68767] [Bug #11035]

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@50182 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
nobu 2015-04-08 04:01:06 +00:00
Родитель ad470f1c38
Коммит 622193d32a
3 изменённых файлов: 27 добавлений и 0 удалений

Просмотреть файл

@ -1,3 +1,8 @@
Wed Apr 8 13:01:06 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
* hash.c (rb_any_hash): Symbols are compared by the identities
always. [ruby-core:68767] [Bug #11035]
Tue Apr 7 10:22:51 2015 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
* internal.h: fix typo. Patch by @sferik [fix GH-865]

3
hash.c
Просмотреть файл

@ -149,6 +149,9 @@ rb_any_hash(VALUE a)
else if (BUILTIN_TYPE(a) == T_STRING) {
hnum = rb_str_hash(a);
}
else if (BUILTIN_TYPE(a) == T_SYMBOL) {
hnum = rb_objid_hash((st_index_t)a);
}
else if (BUILTIN_TYPE(a) == T_FLOAT) {
return rb_dbl_hash(rb_float_value(a));
}

Просмотреть файл

@ -238,4 +238,23 @@ class TestSymbol < Test::Unit::TestCase
200_000.times { |i| i.to_s.to_sym }
end;
end
def test_hash_redefinition
assert_separately([], <<-'end;')
bug11035 = '[ruby-core:68767] [Bug #11035]'
class Symbol
def hash
raise
end
end
h = {}
assert_nothing_raised(RuntimeError, bug11035) {
h[:foo] = 1
}
assert_nothing_raised(RuntimeError, bug11035) {
h['bar'.to_sym] = 2
}
end
end;
end