summaryrefslogtreecommitdiffstats
path: root/hash.c
diff options
context:
space:
mode:
authormatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2009-06-08 05:44:17 +0000
committermatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2009-06-08 05:44:17 +0000
commit88048c2020c7cfca815bd3cf18728a14b6923da4 (patch)
tree5cbf6c80a6d2079ad23093c9f3dd203129c3879e /hash.c
parentc810db6362eb622faff74577edd6f902d4cf807e (diff)
downloadruby-88048c2020c7cfca815bd3cf18728a14b6923da4.tar.gz
ruby-88048c2020c7cfca815bd3cf18728a14b6923da4.tar.xz
ruby-88048c2020c7cfca815bd3cf18728a14b6923da4.zip
* hash.c (rb_hash_reject_bang): always check frozen status.
[ruby-core:23715] * hash.c (rb_hash_update): ditto. * hash.c (rb_hash_reject_bang): call rb_hash_foreach() directly. * hash.c (rb_hash_update_i): call st_insert() directly. * hash.c (rb_hash_update_block_i): ditto. git-svn-id: http://svn.ruby-lang.org/repos/ruby/trunk@23650 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'hash.c')
-rw-r--r--hash.c8
1 files changed, 5 insertions, 3 deletions
diff --git a/hash.c b/hash.c
index 4946ee717..5d85797c2 100644
--- a/hash.c
+++ b/hash.c
@@ -882,10 +882,11 @@ rb_hash_reject_bang(VALUE hash)
st_index_t n;
RETURN_ENUMERATOR(hash, 0, 0);
+ rb_hash_modify(hash);
if (!RHASH(hash)->ntbl)
return Qnil;
n = RHASH(hash)->ntbl->num_entries;
- rb_hash_delete_if(hash);
+ rb_hash_foreach(hash, delete_if_i, hash);
if (n == RHASH(hash)->ntbl->num_entries) return Qnil;
return hash;
}
@@ -1601,7 +1602,7 @@ static int
rb_hash_update_i(VALUE key, VALUE value, VALUE hash)
{
if (key == Qundef) return ST_CONTINUE;
- rb_hash_aset(hash, key, value);
+ st_insert(RHASH(hash)->ntbl, key, value);
return ST_CONTINUE;
}
@@ -1612,7 +1613,7 @@ rb_hash_update_block_i(VALUE key, VALUE value, VALUE hash)
if (rb_hash_has_key(hash, key)) {
value = rb_yield_values(3, key, rb_hash_aref(hash, key), value);
}
- rb_hash_aset(hash, key, value);
+ st_insert(RHASH(hash)->ntbl, key, value);
return ST_CONTINUE;
}
@@ -1642,6 +1643,7 @@ rb_hash_update_block_i(VALUE key, VALUE value, VALUE hash)
static VALUE
rb_hash_update(VALUE hash1, VALUE hash2)
{
+ rb_hash_modify(hash1);
hash2 = to_hash(hash2);
if (rb_block_given_p()) {
rb_hash_foreach(hash2, rb_hash_update_block_i, hash1);