diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2017-06-21 02:25:27 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2017-06-21 02:25:27 +0000 |
commit | b471e39bd1b68e6f820fcdff5512789e56b779b0 (patch) | |
tree | 07c4b84a7b9fb8201af9bace810bb683177e798c | |
parent | 49548a45c14124b200bb39c796823655c482b272 (diff) | |
download | ruby-b471e39bd1b68e6f820fcdff5512789e56b779b0.tar.gz |
Fix Enumerable#uniq with non single yield arguments
* enum.c (uniq_func, uniq_iter): need packed value as the unique
key. [ruby-core:81734] [Bug #13669] [Fix GH-1658]
Author: Kenichi Kamiya <kachick1@gmail.com>
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@59128 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | enum.c | 2 | ||||
-rw-r--r-- | test/ruby/test_enum.rb | 1 |
2 files changed, 3 insertions, 0 deletions
@@ -3855,6 +3855,7 @@ enum_sum(int argc, VALUE* argv, VALUE obj) static VALUE uniq_func(RB_BLOCK_CALL_FUNC_ARGLIST(i, hash)) { + ENUM_WANT_SVALUE(); rb_hash_add_new_element(hash, i, i); return Qnil; } @@ -3862,6 +3863,7 @@ uniq_func(RB_BLOCK_CALL_FUNC_ARGLIST(i, hash)) static VALUE uniq_iter(RB_BLOCK_CALL_FUNC_ARGLIST(i, hash)) { + ENUM_WANT_SVALUE(); rb_hash_add_new_element(hash, rb_yield_values2(argc, argv), i); return Qnil; } diff --git a/test/ruby/test_enum.rb b/test/ruby/test_enum.rb index 991bda9b3f..c36cb43537 100644 --- a/test/ruby/test_enum.rb +++ b/test/ruby/test_enum.rb @@ -977,5 +977,6 @@ class TestEnumerable < Test::Unit::TestCase assert_equal([[1896, "Athens"], [1900, "Paris"], [1904, "Chicago"], [1908, "Rome"]], olympics.uniq{|k,v| v}) assert_equal([1, 2, 3, 4, 5, 10], (1..100).uniq{|x| (x**2) % 10 }.first(6)) + assert_equal([1, [1, 2]], Foo.new.to_enum.uniq) end end |