summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog7
-rw-r--r--lib/set.rb11
-rw-r--r--test/test_set.rb22
3 files changed, 38 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog
index 5626e542864..a1429505ec4 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+Wed Aug 6 19:09:27 2014 Akinori MUSHA <knu@iDaemons.org>
+
+ * 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 <masaki.suketa@nifty.ne.jp>
* ext/win32ole/win32ole.c: separate src of WIN32OLERuntimeError
diff --git a/lib/set.rb b/lib/set.rb
index 0d9870ccd7a..db57594d0a5 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 559bc128973..169136f0d9c 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]