mirror of
https://github.com/ruby/ruby.git
synced 2025-09-19 02:23:59 +02:00
merge revision(s) 49376,49387,49389: [Backport #10761]
* st.c (st_numhash): mix float value for flonum * hash.c (rb_any_hash): ditto * benchmark/bm_hash_aref_flo.rb: new benchmark * benchmark/bm_hash_ident_flo.rb: ditto [Bug #10761] * benchmark/bm_marshal_dump_flo.rb: new benchmark for [Bug #10761] * marshal.c (w_object, marshal_dump): use indetity tables for arbitrary VALUE keys, because of performance of FLONUM. [Bug #10761] * marshal.c (obj_alloc_by_klass, marshal_load): ditto. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_2_2@49513 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
b5623f9863
commit
665f7a2ff1
9 changed files with 67 additions and 8 deletions
20
hash.c
20
hash.c
|
@ -137,7 +137,13 @@ rb_any_hash(VALUE a)
|
|||
|
||||
if (SPECIAL_CONST_P(a)) {
|
||||
if (a == Qundef) return 0;
|
||||
if (STATIC_SYM_P(a)) a >>= (RUBY_SPECIAL_SHIFT + ID_SCOPE_SHIFT);
|
||||
if (STATIC_SYM_P(a)) {
|
||||
a >>= (RUBY_SPECIAL_SHIFT + ID_SCOPE_SHIFT);
|
||||
}
|
||||
else if (FLONUM_P(a)) {
|
||||
/* prevent pathological behavior: [Bug #10761] */
|
||||
a = (st_index_t)rb_float_value(a);
|
||||
}
|
||||
hnum = rb_objid_hash((st_index_t)a);
|
||||
}
|
||||
else if (BUILTIN_TYPE(a) == T_STRING) {
|
||||
|
@ -2501,6 +2507,18 @@ rb_hash_compare_by_id_p(VALUE hash)
|
|||
return Qfalse;
|
||||
}
|
||||
|
||||
st_table *
|
||||
rb_init_identtable(void)
|
||||
{
|
||||
return st_init_table(&identhash);
|
||||
}
|
||||
|
||||
st_table *
|
||||
rb_init_identtable_with_size(st_index_t size)
|
||||
{
|
||||
return st_init_table_with_size(&identhash, size);
|
||||
}
|
||||
|
||||
static int
|
||||
any_p_i(VALUE key, VALUE value, VALUE arg)
|
||||
{
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue