diff options
Diffstat (limited to 'hash.c')
-rw-r--r-- | hash.c | 16 |
1 files changed, 5 insertions, 11 deletions
@@ -4307,15 +4307,6 @@ delete_if_nil(VALUE key, VALUE value, VALUE hash) return ST_CONTINUE; } -static int -set_if_not_nil(VALUE key, VALUE value, VALUE hash) -{ - if (!NIL_P(value)) { - rb_hash_aset(hash, key, value); - } - return ST_CONTINUE; -} - /* * call-seq: * hash.compact -> new_hash @@ -4329,9 +4320,12 @@ set_if_not_nil(VALUE key, VALUE value, VALUE hash) static VALUE rb_hash_compact(VALUE hash) { - VALUE result = rb_hash_new(); + VALUE result = rb_hash_dup(hash); if (!RHASH_EMPTY_P(hash)) { - rb_hash_foreach(hash, set_if_not_nil, result); + rb_hash_foreach(result, delete_if_nil, result); + } + else if (rb_hash_compare_by_id_p(hash)) { + result = rb_hash_compare_by_id(result); } return result; } |