/* * call-seq: * hsh.rehash -> hsh * * Rebuilds the hash based on the current hash values for each key. If * values of key objects have changed since they were inserted, this * method will reindex <i>hsh</i>. If <code>Hash#rehash</code> is * called while an iterator is traversing the hash, an * <code>IndexError</code> will be raised in the iterator. * * a = [ "a", "b" ] * c = [ "c", "d" ] * h = { a => 100, c => 300 } * h[a] #=> 100 * a[0] = "z" * h[a] #=> nil * h.rehash #=> {["z", "b"]=>100, ["c", "d"]=>300} * h[a] #=> 100 */ static VALUE rb_hash_rehash(hash) VALUE hash; { st_table *tbl; rb_hash_modify(hash); tbl = st_init_table_with_size(&objhash, RHASH(hash)->tbl->num_entries); rb_hash_foreach(hash, rb_hash_rehash_i, (st_data_t)tbl); st_free_table(RHASH(hash)->tbl); RHASH(hash)->tbl = tbl; return hash; }