summaryrefslogtreecommitdiff
path: root/hash.c
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2011-01-11 23:37:15 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2011-01-11 23:37:15 +0000
commit79654f3fd3b39938dd7f7d3ea231a8faf74167b2 (patch)
tree0a09891d3d08aa72160ca3d1449136e70edbac8d /hash.c
parent5a17f4c4a341618d2d25c03c64ac72d71234303a (diff)
* hash.c (hash_i): return different values for inverse hash.
[ruby-core:34334] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@30514 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'hash.c')
-rw-r--r--hash.c8
1 files changed, 6 insertions, 2 deletions
diff --git a/hash.c b/hash.c
index c769e60986..c7ac394bcb 100644
--- a/hash.c
+++ b/hash.c
@@ -1663,9 +1663,12 @@ static int
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 @@ recursive_hash(VALUE hash, VALUE dummy, int recur)
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);
}