aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--hash.c5
-rw-r--r--test/ruby/test_hash.rb3
3 files changed, 11 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog
index b347ff857a..8f9ac7ded0 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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.
diff --git a/hash.c b/hash.c
index 630269d125..db8bdc8bb6 100644
--- a/hash.c
+++ b/hash.c
@@ -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