diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2016-10-22 09:52:35 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2016-10-22 09:52:35 +0000 |
commit | 4154b96068eab8fc5e9359ad26747e9dabdceea1 (patch) | |
tree | b5a33c5aaa64a868950a8ffc5de72586374628da | |
parent | 5caaef7ad9b384969a037284272645939ec3c9c6 (diff) |
hash.c: fix Hash#compact! return value
* hash.c (rb_hash_compact_bang): should return nil if no elements
is deleted. [ruby-core:77709] [Bug #12863]
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@56473 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | hash.c | 5 | ||||
-rw-r--r-- | test/ruby/test_hash.rb | 3 |
3 files changed, 11 insertions, 2 deletions
@@ -1,3 +1,8 @@ +Sat Oct 22 18:52:32 2016 Nobuyoshi Nakada <nobu@ruby-lang.org> + + * hash.c (rb_hash_compact_bang): should return nil if no elements + is deleted. [ruby-core:77709] [Bug #12863] + Sat Oct 22 10:28:28 2016 Nobuyoshi Nakada <nobu@ruby-lang.org> * configure.in (DLDFLAGS): fallback to LDFLAGS. @@ -2726,9 +2726,12 @@ rb_hash_compact_bang(VALUE hash) { rb_hash_modify_check(hash); if (RHASH(hash)->ntbl) { + st_index_t n = RHASH(hash)->ntbl->num_entries; rb_hash_foreach(hash, delete_if_nil, hash); + if (n != RHASH(hash)->ntbl->num_entries) + return hash; } - return hash; + return Qnil; } static VALUE rb_hash_compare_by_id_p(VALUE hash); diff --git a/test/ruby/test_hash.rb b/test/ruby/test_hash.rb index 7720b6098e..c0ccd65fca 100644 --- a/test/ruby/test_hash.rb +++ b/test/ruby/test_hash.rb @@ -358,8 +358,9 @@ class TestHash < Test::Unit::TestCase h = @cls[a: 1, b: nil, c: false, d: true, e: nil] assert_equal({a: 1, c: false, d: true}, h.compact) assert_equal({a: 1, b: nil, c: false, d: true, e: nil}, h) - h.compact! + assert_same(h, h.compact!) assert_equal({a: 1, c: false, d: true}, h) + assert_nil(h.compact!) end def test_dup |