diff --git a/ChangeLog b/ChangeLog index 5626e54286..a1429505ec 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +Wed Aug 6 19:09:27 2014 Akinori MUSHA + + * lib/set.rb (Set): Implement Set#clone by splitting + initialize_copy into initialize_dup and initialize_clone. + Submitted by yui-knk. [Fixes GH-661] + https://github.com/ruby/ruby/pull/661 + Wed Aug 6 18:42:58 2014 Masaki Suketa * ext/win32ole/win32ole.c: separate src of WIN32OLERuntimeError diff --git a/lib/set.rb b/lib/set.rb index 0d9870ccd7..db57594d0a 100644 --- a/lib/set.rb +++ b/lib/set.rb @@ -100,11 +100,18 @@ class Set end private :do_with_enum - # Copy internal hash. - def initialize_copy(orig) + # Dup internal hash. + def initialize_dup(orig) + super @hash = orig.instance_variable_get(:@hash).dup end + # Clone internal hash. + def initialize_clone(orig) + super + @hash = orig.instance_variable_get(:@hash).clone + end + def freeze # :nodoc: @hash.freeze super diff --git a/test/test_set.rb b/test/test_set.rb index 559bc12897..169136f0d9 100644 --- a/test/test_set.rb +++ b/test/test_set.rb @@ -585,6 +585,28 @@ class TC_Set < Test::Unit::TestCase assert_equal 4, set.size end + def test_freeze_dup + set1 = Set[1,2,3] + set1.freeze + set2 = set1.dup + + assert_not_predicate set2, :frozen? + assert_nothing_raised { + set2.add 4 + } + end + + def test_freeze_clone + set1 = Set[1,2,3] + set1.freeze + set2 = set1.clone + + assert_predicate set2, :frozen? + assert_raise(RuntimeError) { + set2.add 5 + } + end + def test_inspect set1 = Set[1]