diff options
author | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2009-06-08 05:44:17 +0000 |
---|---|---|
committer | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2009-06-08 05:44:17 +0000 |
commit | 33a8def1e1f0a0cef4e88e26e8870e6806092cd9 (patch) | |
tree | 5cbf6c80a6d2079ad23093c9f3dd203129c3879e /hash.c | |
parent | 0cdfbc9446d65959dc24b82e38b3cb5d6f9d825f (diff) | |
download | ruby-33a8def1e1f0a0cef4e88e26e8870e6806092cd9.tar.gz |
* 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: svn+ssh://ci.ruby-lang.org/ruby/trunk@23650 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'hash.c')
-rw-r--r-- | hash.c | 8 |
1 files changed, 5 insertions, 3 deletions
@@ -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); |