aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2014-07-06 14:42:57 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2014-07-06 14:42:57 +0000
commitea74da0c6c71edf8025ff67fbf445251d512acf1 (patch)
tree4d547dac3596947771af9fc8997e7b641e605b7d
parente6be6ebc7701c31e83cc25a7463bc72c59b2782d (diff)
downloadruby-ea74da0c6c71edf8025ff67fbf445251d512acf1.tar.gz
st.c: re-calc hash_val before adding
* st.c (st_update): re-calculate hash_val before adding if key was changed, otherwise cannot access the newly added element if it has different hash value. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@46722 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--st.c2
1 files changed, 2 insertions, 0 deletions
diff --git a/st.c b/st.c
index 1d78ffebad..117f582703 100644
--- a/st.c
+++ b/st.c
@@ -843,6 +843,7 @@ st_update(st_table *table, st_data_t key, st_update_callback_func *func, st_data
switch (retval) {
case ST_CONTINUE:
if (!existing) {
+ if (key != old_key) hash_val = do_hash(key, table);
add_packed_direct(table, key, value, hash_val);
break;
}
@@ -878,6 +879,7 @@ st_update(st_table *table, st_data_t key, st_update_callback_func *func, st_data
switch (retval) {
case ST_CONTINUE:
if (!existing) {
+ if (key != old_key) hash_val = do_hash(key, table);
add_direct(table, key, value, hash_val, hash_pos(hash_val, table->num_bins));
break;
}