From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on dcvr.yhbt.net X-Spam-Level: X-Spam-ASN: AS43350 77.247.176.0/21 X-Spam-Status: No, score=-0.2 required=3.0 tests=AWL,BAYES_00,MSGID_RANDY, RCVD_IN_XBL shortcircuit=no autolearn=no version=3.3.2 X-Original-To: spew@80x24.org Received: from 80x24.org (politkovskaja.torservers.net [77.247.181.165]) by dcvr.yhbt.net (Postfix) with ESMTP id DD2BD1F49D for ; Wed, 21 Jan 2015 22:04:14 +0000 (UTC) From: Eric Wong To: spew@80x24.org Subject: [PATCH] fix flonum hashing regression from r45384 Date: Wed, 21 Jan 2015 22:03:07 +0000 Message-Id: X-Mailer: git-send-email 2.2.0 List-Id: * st.c (st_numhash): use float value for flonum * hash.c (rb_any_hash): ditto * benchmark/bm_hash_aref_flo.rb: new benchmark * benchmark/bm_hash_aref_flo_ident.rb: ditto [Bug #10761] --- benchmark/bm_hash_aref_flo.rb | 4 ++++ benchmark/bm_hash_aref_flo_ident.rb | 4 ++++ hash.c | 7 ++++++- st.c | 5 +++++ 4 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 benchmark/bm_hash_aref_flo.rb create mode 100644 benchmark/bm_hash_aref_flo_ident.rb diff --git a/benchmark/bm_hash_aref_flo.rb b/benchmark/bm_hash_aref_flo.rb new file mode 100644 index 0000000..a097bb5 --- /dev/null +++ b/benchmark/bm_hash_aref_flo.rb @@ -0,0 +1,4 @@ +h = {} +strs = (1..10000).to_a.map!(&:to_f) +strs.each { |s| h[s] = s } +50.times { strs.each { |s| h[s] } } diff --git a/benchmark/bm_hash_aref_flo_ident.rb b/benchmark/bm_hash_aref_flo_ident.rb new file mode 100644 index 0000000..0c7edfe --- /dev/null +++ b/benchmark/bm_hash_aref_flo_ident.rb @@ -0,0 +1,4 @@ +h = {}.compare_by_identity +strs = (1..10000).to_a.map!(&:to_f) +strs.each { |s| h[s] = s } +50.times { strs.each { |s| h[s] } } diff --git a/hash.c b/hash.c index d54ab8a..3a90fdb 100644 --- a/hash.c +++ b/hash.c @@ -137,7 +137,12 @@ 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)) { + a = (st_index_t)rb_float_value(a); + } hnum = rb_objid_hash((st_index_t)a); } else if (BUILTIN_TYPE(a) == T_STRING) { diff --git a/st.c b/st.c index b7f66d0..2ffa986 100644 --- a/st.c +++ b/st.c @@ -1762,5 +1762,10 @@ st_numhash(st_data_t n) * - avoid expensive modulo instructions, it is currently only * shifts and bitmask operations. */ +#ifdef USE_FLONUM /* RUBY */ + if (FLONUM_P(n)) + return (st_index_t)rb_float_value(n); +#endif + return (st_index_t)((n>>(RUBY_SPECIAL_SHIFT+3)|(n<<3)) ^ (n>>3)); } -- EW