diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2013-12-11 07:01:29 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2013-12-11 07:01:29 +0000 |
commit | 740535f843d65be45732e45b9fc07eadc4d63ba7 (patch) | |
tree | 4f0745f8f3a1157e088d1d9c5b55b88dc987c113 /hash.c | |
parent | bd892d05ed0565526c26b3e126a469e19865107b (diff) | |
download | ruby-740535f843d65be45732e45b9fc07eadc4d63ba7.tar.gz |
hash.c: reject should return a plain hash
* hash.c (rb_hash_reject): return a plain hash, without copying
the class, default value, instance variables, and taintedness.
they had been copied just by accident.
[ruby-core:59045] [Bug #9223]
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@44137 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'hash.c')
-rw-r--r-- | hash.c | 35 |
1 files changed, 20 insertions, 15 deletions
@@ -1095,37 +1095,39 @@ rb_hash_reject_bang(VALUE hash) } static int -reject_i(VALUE key, VALUE value, VALUE hash) +reject_i(VALUE key, VALUE value, VALUE result) { if (!RTEST(rb_yield_values(2, key, value))) { - rb_hash_aset(hash, key, value); + rb_hash_aset(result, key, value); } return ST_CONTINUE; } /* * call-seq: - * hsh.reject {| key, value | block } -> a_hash - * hsh.reject -> an_enumerator + * hsh.reject {|key, value| block} -> a_hash + * hsh.reject -> an_enumerator + * + * Returns a new hash consisting of entries for which the block returns false. * - * Same as <code>Hash#delete_if</code>, but works on (and returns) a - * copy of the <i>hsh</i>. Equivalent to - * <code><i>hsh</i>.dup.delete_if</code>. + * If no block is given, an enumerator is returned instead. * + * h = { "a" => 100, "b" => 200, "c" => 300 } + * h.reject {|k,v| k < "b"} #=> {"b" => 200, "c" => 300} + * h.reject {|k,v| v > 100} #=> {"a" => 100} */ -static VALUE +VALUE rb_hash_reject(VALUE hash) { - VALUE ret; + VALUE result; RETURN_SIZED_ENUMERATOR(hash, 0, 0, hash_enum_size); - ret = hash_alloc(rb_obj_class(hash)); - OBJ_INFECT(ret, hash); + result = rb_hash_new(); if (!RHASH_EMPTY_P(hash)) { - rb_hash_foreach(hash, reject_i, ret); + rb_hash_foreach(hash, reject_i, result); } - return ret; + return result; } /* @@ -1154,8 +1156,9 @@ rb_hash_values_at(int argc, VALUE *argv, VALUE hash) static int select_i(VALUE key, VALUE value, VALUE result) { - if (RTEST(rb_yield_values(2, key, value))) + if (RTEST(rb_yield_values(2, key, value))) { rb_hash_aset(result, key, value); + } return ST_CONTINUE; } @@ -1180,7 +1183,9 @@ rb_hash_select(VALUE hash) RETURN_SIZED_ENUMERATOR(hash, 0, 0, hash_enum_size); result = rb_hash_new(); - rb_hash_foreach(hash, select_i, result); + if (!RHASH_EMPTY_P(hash)) { + rb_hash_foreach(hash, select_i, result); + } return result; } |