Bug #9202 ยป 0001-Array-uniq-uniq-does-not-return-frozen-hash-keys.patch
| array.c | ||
|---|---|---|
|     long i; | ||
|     for (i=0; i<RARRAY_LEN(ary); i++) { | ||
| 	rb_hash_aset(hash, RARRAY_AREF(ary, i), Qtrue); | ||
| 	VALUE elt = RARRAY_AREF(ary, i); | ||
| 	rb_hash_aset(hash, elt, elt); | ||
|     } | ||
|     return hash; | ||
| } | ||
| ... | ... | |
|     ary2 = to_ary(ary2); | ||
|     hash = ary_add_hash(ary_make_hash(ary1), ary2); | ||
|     ary3 = rb_hash_keys(hash); | ||
|     ary3 = rb_hash_values(hash); | ||
|     ary_recycle_hash(hash); | ||
|     return ary3; | ||
| } | ||
| static int | ||
| push_key(st_data_t key, st_data_t val, st_data_t ary) | ||
| push_val(st_data_t key, st_data_t val, st_data_t ary) | ||
| { | ||
|     rb_ary_push((VALUE)ary, (VALUE)key); | ||
|     rb_ary_push((VALUE)ary, (VALUE)val); | ||
|     return ST_CONTINUE; | ||
| } | ||
| ... | ... | |
| 	    FL_SET_EMBED(ary); | ||
| 	} | ||
| 	ary_resize_capa(ary, hash_size); | ||
| 	st_foreach(rb_hash_tbl_raw(hash), push_key, ary); | ||
| 	st_foreach(rb_hash_tbl_raw(hash), push_val, ary); | ||
|     } | ||
|     ary_recycle_hash(hash); | ||
| ... | ... | |
|     } | ||
|     else { | ||
| 	hash = ary_make_hash(ary); | ||
| 	uniq = rb_hash_keys(hash); | ||
| 	uniq = rb_hash_values(hash); | ||
|     } | ||
|     RBASIC_SET_CLASS(uniq, rb_obj_class(ary)); | ||
|     ary_recycle_hash(hash); | ||
| test/ruby/test_array.rb | ||
|---|---|---|
|     assert_equal(d, c) | ||
|     assert_equal(@cls[1, 2, 3], @cls[1, 2, 3].uniq) | ||
|     a = %w(a a) | ||
|     b = a.uniq | ||
|     assert_equal(%w(a a), a) | ||
|     assert(a.none?(&:frozen?)) | ||
|     assert_equal(%w(a), b) | ||
|     assert(b.none?(&:frozen?)) | ||
|   end | ||
|   def test_uniq_with_block | ||
| ... | ... | |
|     assert_equal([1,3], a) | ||
|     assert_equal([1], b) | ||
|     assert_not_same(a, b) | ||
|     a = %w(a a) | ||
|     b = a.uniq {|v| v } | ||
|     assert_equal(%w(a a), a) | ||
|     assert(a.none?(&:frozen?)) | ||
|     assert_equal(%w(a), b) | ||
|     assert(b.none?(&:frozen?)) | ||
|   end | ||
|   def test_uniq! | ||
| ... | ... | |
|       a.sort_by!{|e| e[:c]} | ||
|       a.uniq!   {|e| e[:c]} | ||
|     end | ||
|     a = %w(a a) | ||
|     b = a.uniq | ||
|     assert_equal(%w(a a), a) | ||
|     assert(a.none?(&:frozen?)) | ||
|     assert_equal(%w(a), b) | ||
|     assert(b.none?(&:frozen?)) | ||
|   end | ||
|   def test_uniq_bang_with_block | ||
| ... | ... | |
|     b = a.uniq! {|v| v.even? } | ||
|     assert_equal([1,2], a) | ||
|     assert_equal(nil, b) | ||
|     a = %w(a a) | ||
|     b = a.uniq! {|v| v } | ||
|     assert_equal(%w(a), b) | ||
|     assert_same(a, b) | ||
|     assert b.none?(&:frozen?) | ||
|   end | ||
|   def test_uniq_bang_with_freeze | ||
| ... | ... | |
|     assert_equal(@cls[1,2], @cls[1] | @cls[2]) | ||
|     assert_equal(@cls[1,2], @cls[1, 1] | @cls[2, 2]) | ||
|     assert_equal(@cls[1,2], @cls[1, 2] | @cls[1, 2]) | ||
|     a = %w(a b c) | ||
|     b = %w(a b c d e) | ||
|     c = a | b | ||
|     assert_equal(c, b) | ||
|     assert_not_same(c, b) | ||
|     assert_equal(%w(a b c), a) | ||
|     assert_equal(%w(a b c d e), b) | ||
|     assert(a.none?(&:frozen?)) | ||
|     assert(b.none?(&:frozen?)) | ||
|     assert(c.none?(&:frozen?)) | ||
|   end | ||
|   def test_combination | ||