ruby-changes:18491
From: nobu <ko1@a...>
Date: Wed, 12 Jan 2011 08:37:27 +0900 (JST)
Subject: [ruby-changes:18491] Ruby:r30514 (trunk): * hash.c (hash_i): return different values for inverse hash.
nobu 2011-01-12 08:37:15 +0900 (Wed, 12 Jan 2011) New Revision: 30514 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=30514 Log: * hash.c (hash_i): return different values for inverse hash. [ruby-core:34334] Modified files: trunk/ChangeLog trunk/hash.c trunk/test/ruby/test_hash.rb Index: ChangeLog =================================================================== --- ChangeLog (revision 30513) +++ ChangeLog (revision 30514) @@ -1,3 +1,8 @@ +Wed Jan 12 08:37:07 2011 Nobuyoshi Nakada <nobu@r...> + + * hash.c (hash_i): return different values for inverse hash. + [ruby-core:34334] + Tue Jan 11 20:32:59 2011 Tanaka Akira <akr@f...> * variable.c: parenthesize macro arguments. Index: hash.c =================================================================== --- hash.c (revision 30513) +++ hash.c (revision 30514) @@ -1663,9 +1663,12 @@ hash_i(VALUE key, VALUE val, VALUE arg) { st_index_t *hval = (st_index_t *)arg; + st_index_t hdata[2]; if (key == Qundef) return ST_CONTINUE; - *hval ^= rb_hash_end(rb_hash_uint(rb_hash_start(rb_hash(key)), rb_hash(val))); + hdata[0] = rb_hash(key); + hdata[1] = rb_hash(val); + *hval ^= st_hash(hdata, sizeof(hdata), 0); return ST_CONTINUE; } @@ -1678,9 +1681,10 @@ return LONG2FIX(0); hval = RHASH(hash)->ntbl->num_entries; if (recur) - hval = rb_hash_end(rb_hash_uint(rb_hash_start(rb_hash(rb_cHash)), hval)); + hval = rb_hash_uint(rb_hash_start(rb_hash(rb_cHash)), hval); else rb_hash_foreach(hash, hash_i, (VALUE)&hval); + hval = rb_hash_end(hval); return INT2FIX(hval); } Index: test/ruby/test_hash.rb =================================================================== --- test/ruby/test_hash.rb (revision 30513) +++ test/ruby/test_hash.rb (revision 30514) @@ -890,7 +890,7 @@ assert_equal({x=>1}.hash, {x=>1}.hash) o = Object.new - def o.hash; 2<<100; end + def o.hash; 2 << 100; end assert_equal({x=>1}.hash, {x=>1}.hash) end @@ -904,4 +904,11 @@ h.rehash assert_equal(:foo, h[h]) end + + def test_inverse_hash + feature4262 = '[ruby-core:34334]' + [{1=>2}, {123=>"abc"}].each do |h| + assert_not_equal(h.hash, h.invert.hash, feature4262) + end + end end -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/