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:
naruse 2015-02-05 16:05:10 +00:00
parent b5623f9863
commit 665f7a2ff1
9 changed files with 67 additions and 8 deletions

20
hash.c
View file

@ -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)
{